3

RSS フィードに奇妙な文字が含まれているため、RSS フィードのデバッグを開始しました (文字の欠落グリフなど)。私は 2 つの優れた初心者用リソースから始めました。

RSS フィードに問題があると思われる理由は、ユーザーが MS Word ドキュメントをコピーしてサイトのテキストエリアに貼り付けており、PHP ページが特別な「Windows-1252」と互換性のない「iso-8859-1」文字セットを使用しているためです。 MS Word で使用される箇条書きやスマート クォートなどのエンコーディング。

だから私は問題を解決したいと思っています。私がする必要があるのは、ユーザー入力を受け取る/与えるページで「utf-8」の使用を開始することだけですか??. つまり、HEAD セクションで次のように設定します。

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

しかし、私がこの質問を提起している本当の理由は、ユーザー入力を格納する DB フィールドが " " にあり、それらを " "latin1_swedish_ciに変換する必要があるかどうかを知りたいからです。utf8_general_ciMySQL は実際には文字セットを気にしませんか? 大量のバイトが表示されるだけで、Latin として照合されたフィールドに Unicode を入力しても、Unicode として返されますよね? フィールドは FULLTEXT インデックスの一部であり、他のフィールドも照合を変更する必要があるため、フィールドを変更するのは面倒です。つまり、インデックスを削除して再構築する必要があります (大量の TEXT が含まれる場合、これは簡単な作業ではありません)。

4

4 に答える 4

6

ただし、この質問を提起する本当の理由は、ユーザー入力を格納するDBフィールドが「latin1_swedish_ci」にあり、それらを「utf8_general_ci」に変換する必要があるかどうかを知りたいからです。

いいえ。これは照合です。文字セットではありませんlatin1_swedish_ciutf8_general_ci照合は、文字の格納方法や入出力には影響しません。並べ替え関数が結果を並べ替える方法を制御するだけです。照合(期待どおりに機能する)は、ストレージ文字セットと一致する必要があります。したがって、テーブルがutf8に格納されている場合は、utf8照合を使用する必要があります。

mysqlのストレージ文字セットは、phpの文字セットに直接関連付けられていません。phpでiso-8859-1を使用しながら、Mysqlのストレージ文字セットとしてutf8を使用できます。その場合、接続に文字セットを設定して、Mysqlにそのことを伝える必要があります(set names XXX)。その後、Mysqlは必要に応じて変換します。Mysqlとphpで同じ文字セットを使用しないと、dommonの分母が最も低い文字セット容量になってしまうため、文字列がutf8に格納されていても、Unicodeの文字範囲全体を使用することはできません。利用可能。したがって、 Mysqlとphpの両方でutf8を使用する必要があります。

于 2009-05-12T12:42:23.463 に答える
1

いいえ-絶対にありません。MySQLは文字列をある文字セットから別の文字セットにオンザフライで変換する機能を備えているため、MySQLサーバーは、クライアント側で使用している文字セットを認識していることが重要です(クライアント側= PHPスクリプトであり、クライアントがアクセスしているクライアントではありません)。ウェブページ)。これは、クエリを発行することで実行できます

SET NAMES 'utf8';

サーバーに送信する他のクエリの前。次に、MySQLは、クライアント文字セットから内部MySQL文字セット、テーブルおよび/または列文字セットへの適切な変換を実行します。したがって、通常は、正しいクライアント文字セットの設定についてのみ心配する必要があります。この文字セットは、データをWebサーバーに出力するために使用する文字セットと一致する必要があります。

MySQLのマニュアルをご覧ください。

于 2009-05-12T11:36:12.797 に答える
1

pdo/mysql で mysql 接続文字セットを適切に変更する方法を探す時間を節約するために、次のようにします。

$dbc = new pdo('mysql:dbname=DBNAME;host=DBHOST', $user, $pw, array(PDO::MYSQL_ATTR_INIT_COMMAND => sprintf( "SET NAMES %s", $charset ) ) );
于 2009-05-12T20:57:25.813 に答える
0

HTTP では、文字エンコーディングは、HTTP 応答のヘッダー フィールドcharsetのパラメーターによって宣言されます。他の宣言は、HTTP ヘッダーの宣言によって上書きされますContent-Type

[…] ユーザー エージェントは、ドキュメントの文字エンコーディングを決定する際に、次の優先順位に従う必要があります (最高の優先順位から最低の順)。

  1. " " フィールドの HTTP " charset" パラメータ。Content-Type
  2. " " が " " に設定され、値が" " に設定されたMETA宣言。http-equivContent-Typecharset
  3. charset外部リソースを指定する要素に設定される属性。

さらに、要素のaccept-charset属性を使用して、受け入れられる文字エンコーディングを明示的に宣言する必要があります。formそれ以外の場合、ユーザー エージェントは、入力データをエンコードするためにフォーム ドキュメントで使用されている文字エンコードを使用できます (ただし、使用してはなりません)。

この属性のデフォルト値は予約文字列「UNKNOWN」です。ユーザー エージェントは、この値を、このFORM要素を含むドキュメントの送信に使用された文字エンコーディングとして解釈する場合があります。

これにより、受信データが正しくエンコードされる可能性が最も高くなります。しかし、それは保証されていません。そのため、データが実際に UTF-8 でエンコードされているかどうかを確認することをお勧めします (これを行う関数/アルゴリズムがあります)。

于 2009-05-12T11:46:11.303 に答える