私はすべての非常に異なるアルファベットを持っている国際的なクライアントのために働いているので、すべての文字エンコードが正しく挿入されることを保証する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_ci
MySQL接続照合として使用します。
(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/