HTMLフォームがあり、一部のユーザーはMSWordからテキストをコピーして貼り付けています。一重引用符または二重引用符がある場合、それらは次のような面白い文字に翻訳されます。
'€™および’
データベース列は照合utf8_general_ciです。
適切なキャラクターを表示するにはどうすればよいですか?
編集:問題は解決しました。これが私がそれを修正した方法です:
データベースに追加/データベースから取得する前にmysql_query("SET NAMES 'utf8'");
を実行しました。 (以下のドナルのコメントに感謝します)。
そして少し奇妙なことに、php関数urlencode($text)
が表示時に適用されたため、削除する必要がありました。
また、ページのヘッダーとajaxリクエスト/レスポンスがすべてutf8であることを確認しました。
これは、ISO-8859-1として解釈されるUnicode(UTF-8である可能性が最も高い)文字の古典的なケースのように見えます。途中でキャラクターが破損する可能性のある場所がいくつかあります。まず、クライアントのブラウザがデータを送信する必要があります。文字をページの文字エンコードに適切に変換できない場合、データが破損する可能性があります。次に、サーバーはデータを読み取り、バイトを文字にデコードします。クライアントとサーバーが使用されるエンコーディングについて同意しない場合、文字は破損します。次に、データはデータベースに保存されます。ここでも、破損の可能性があります。最後に、データが(ブラウザに表示するために)ページに書き込まれるときに、ページがエンコーディングを適切に示していない場合、ブラウザはバイトを誤って解釈する可能性があります。
全体でUTF-8を使用していることを確認する必要があります。 Webページのデフォルトはiso-8859-1であるため、WebページにはContent-Typeヘッダーまたはメタタグを付けて提供する必要があります
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
(実際にそのエンコーディングでテキストを提供していることを確認してください)。
プロセスのすべての部分でUTF-8を使用することにより、動作しているすべてのWebブラウザーとデータベースでの問題を回避できます。
ページが使用するエンコーディングを確認してください。 UTF-8も使用してエンコードし、エンコードを説明するメタタグを追加します。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
スマートクォートで混乱をクリーンアップしようとするPHP関数があります。プロトタイプ開発中にケースがポップアップするにつれて少し有機的に成長するため、少し混乱します。しかし、いくつかの助け:
function convert_smart_quotes($string) {
$search = array(chr(0xe2) . chr(0x80) . chr(0x98),
chr(0xe2) . chr(0x80) . chr(0x99),
chr(0xe2) . chr(0x80) . chr(0x9c),
chr(0xe2) . chr(0x80) . chr(0x9d),
chr(0xe2) . chr(0x80) . chr(0x93),
chr(0xe2) . chr(0x80) . chr(0x94),
chr(226) . chr(128) . chr(153),
'’','“','â€<9d>','â€"',' ');
$replace = array("'","'",'"','"',' - ',' - ',"'","'",'"','"',' - ',' ');
return str_replace($search, $replace, $string);
}