web-dev-qa-db-ja.com

HTMLフォームで送信すると、引用符が面白い文字に変わるのはなぜですか?

HTMLフォームがあり、一部のユーザーはMSWordからテキストをコピーして貼り付けています。一重引用符または二重引用符がある場合、それらは次のような面白い文字に翻訳されます。

'€™および’

データベース列は照合utf8_general_ciです。

適切なキャラクターを表示するにはどうすればよいですか?

編集:問題は解決しました。これが私がそれを修正した方法です:

データベースに追加/データベースから取得する前にmysql_query("SET NAMES 'utf8'");を実行しました。 (以下のドナルのコメントに感謝します)。

そして少し奇妙なことに、php関数urlencode($text)が表示時に適用されたため、削除する必要がありました。

また、ページのヘッダーとajaxリクエスト/レスポンスがすべてutf8であることを確認しました。

17
Steve

これは、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" />
8
Marius

スマートクォートで混乱をクリーンアップしようとする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);
}
4
Mike A.