7

私はすべての非常に異なるアルファベットを持っている国際的なクライアントのために働いているので、すべての文字エンコードが正しく挿入されることを保証するPHPとMySQL間の完全なワークフローの概要を最終的に取得しようとしています。私はこれに関するたくさんのチュートリアルを読みましたが、まだ質問があり(学ぶことがたくさんあります)、ここにすべてをまとめて尋ねるかもしれないと思いました。

PHP

header('Content-Type:text/html; charset=UTF-8');
mb_internal_encoding('UTF-8');

HTML

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<form accept-charset="UTF-8"> .. </form>

(後者はオプションであり、むしろ提案ですが、私はむしろ何もしないことを提案したいと思います)

MySQL

CREATE database_name DEFAULT CHARACTER SET utf8;またはALTER database_name DEFAULT CHARACTER SET utf8;および/またはutf8_general_ciMySQL接続照合として使用します。

(varcharを使用すると、データベースのサイズが大きくなることに注意してください)

繋がり

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET utf8");

ビジネスロジック

UTF8でないかどうかを検出しmb_detect_encoding()、で変換しivon()ます。
UTF8およびUTF16の過度に長いシーケンスの検証

$body=preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]|(?<=^|[\x00-\x7F])[\x80-\xBF]+|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/','�',$body);
$body=preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $body);

質問

  • PHP 5.3以降ではmb_internal_encoding('UTF-8')必要です。もしそうなら、これは、?の代わりにコア関数の代わりにすべてのマルチバイト関数を使用する必要があることを意味しますmb_substr()substr()

  • 不正な入力の刺し傷をチェックする必要がありますか?もしそうなら、そうするための信頼できる関数/クラスは何ですか?私はおそらく悪いデータを取り除きたくなくて、音訳について十分に知りません。

  • それは本当にあるべきですか、utf8_general_ciそれともむしろutf8_binですか?

  • 上記のワークフローに欠けているものはありますか?

ソース:

http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/  
http://webcollab.sourceforge.net/unicode.html  
http://stackoverflow.com/a/3742879/1043231  
http://www.adayinthelifeof.nl/2010/12/04/about-using-utf-8-fields-in-mysql/  
http://akrabat.com/php/utf8-php-and-mysql/  
4

2 に答える 2

6
  • mb_internal_encoding('UTF-8')それ自体は何もしません。各mb_関数のデフォルトのエンコーディング パラメータを設定するだけです。関数を使用してmb_いない場合は、違いはありません。$encodingもしそうなら、毎回個別にパラメーターを渡す必要がないように設定することは理にかなっています。
  • mb_detect_encoding未知のテキストのエンコーディングを正確に検出することは基本的に不可能であるため、IMOはほとんど役に立ちません。仕様があるため、テキストのブロブがどのエンコーディングに含まれているかを知る必要があります。または、エンコーディングが指定されているヘッダーやメタ タグなどの適切なメタ データを解析する必要があります。
  • テキストのブロブが、期待するエンコーディングで有効かどうかを確認するために使用mb_check_encodingするだけで、通常は十分です。そうでない場合は、破棄して適切なエラーをスローします。
  • それにかんする:

    これは、コア関数の代わりにすべてのマルチバイト関数を使用する必要があることを意味しますか?

    マルチバイト文字を含む文字列を操作している場合は、そうですmb_。関数を使用して、間違った結果が得られないようにする必要があります。コア文字列関数は、文字レベルではなく、バイト レベルでのみ機能します。これは、文字列を操作するときに通常必要となるものです。

  • utf8_general_civs.は、照合時、つまり文字列の並べ替えと比較utf8_bin時にのみ違いが生じます。データはバイナリ形式で処理されます。つまり、同一のデータのみが同一です。いくつかのロジックが適用されます。たとえば、"é" は "e" と一緒に並べ替えられ、大文字は小文字と等しいと見なされます。utf8_binutf8_general_ci
于 2012-06-13T12:06:44.110 に答える
1

本当に utf8_general_ci または utf8_bin である必要がありますか?

大文字と小文字を区別する検索には utf8_bin を使用する必要があります。それ以外の場合は utf8_general_ci

mb_internal_encoding('UTF-8') は PHP 5.3 以降で必要ですか? もしそうなら、substr() の代わりに mb_substr() のようなコア関数の代わりにすべてのマルチバイト関数を使用しなければならないということですか?

はい、もちろん、マルチバイト文字列がある場合は、str_replace() のようなバイナリ セーフな PHP 標準関数を除いて、動作する mb_* ファミリ関数が必要です。(およびその他のいくつか)

不正な入力文字列をチェックする必要がありますか?もしそうなら、そうするための信頼できる関数/クラスは何ですか? 私はおそらく悪いデータを削除したくなく、音訳について十分に知りません。

うーん、チェックできません。

于 2012-06-13T12:02:33.330 に答える