新しいサーバーを立ち上げて、ウェブアプリケーションでUTF-8を完全にサポートしたいと思っています。過去に既存のサーバーで試したことがありますが、いつもISO-8859-1に戻さなければならないようです。
具体的にはどこでエンコードや文字列を設定すればよいのでしょうか?これを行うためには、Apache、MySQL、PHPを設定する必要があることは承知していますが、何か標準的なチェックリストがあるのか、あるいはミスマッチが発生する箇所のトラブルシューティングができるのか。
これは新しいLinuxサーバーで、MySQL 5、PHP 5、Apache 2が稼働しています。
データストレージ。
utf8mb4
文字セットを指定します。 これにより、MySQLはUTF-8でネイティブにエンコードされた値を物理的に保存および取得します。 なお、utf8mb4_*
照合順序が指定されている場合、MySQL は暗黙的に utf8mb4
エンコーディングを使用します (明示的なキャラクタセットを指定しない場合)。utf8
を使用することを余儀なくされます。 冗談じゃないですよ。
データアクセス:utf8mb4
に設定する必要があります。 こうすることで、MySQLはアプリケーションにデータを渡す際に、ネイティブのUTF-8からの変換を行いませんし、その逆も同様です。charset
を指定することができます。
$dbh = new PDO('mysql:charset=utf8mb4');set_charset()
を呼び出すことができます。
$mysqli->set_charset('utf8mb4'); // オブジェクト指向のスタイル
mysqli_set_charset($link, 'utf8mb4'); // 手続き型スタイルmysql_set_charset
][2] を呼び出すことができます。SET NAMES 'utf8mb4'
。utf8mb4
/utf8
についても、上記と同様の配慮が必要です。
出力:default_charset
php.ini オプションを使用するか、手動で Content-Type
MIME ヘッダーを発行することができますが、これは手間がかかるだけで効果は同じです。json_encode()
を使って出力をエンコードする際には、第2パラメータとして JSON_UNESCAPED_UNICODE
を追加します。
入力。mb_check_encoding()
がその役割を果たしますが、これを忠実に使わなければなりません。 悪意のあるクライアントは好きなエンコーディングでデータを送信できるので、これを回避する方法は実際にはありません。<form>
タグに accept-charset
属性を追加することです。<form ... accept-charset="UTF-8">
.<form>
タグに明示的に記述する必要があることに注意してください。
その他のコードに関する注意点:mbstring
関数を使用するべきです。php.ini で default_charset
を設定することに加えて、コードの中で header()
を使って、出力の前に正しい文字セットを送ることができます。
header('Content-Type: text/html; charset=utf-8');
PHPでUnicodeを扱うことは、ほとんどの文字列関数がUnicodeでは動作せず、中には文字列を完全に破壊してしまうものもあることを理解していれば簡単です。PHP は、「文字」を 1 バイト長とみなします。これで良い場合もあります (例えば、explode()
はバイト列を探し、それをセパレータとして使用するだけなので、実際にどのような文字を探すかは問題ではありません)。しかし、他の場合、その関数が実際には文字に対して動作するように設計されている場合、PHPはあなたのテキストがUnicodeで見られるマルチバイト文字を持っていることを知りません。
調べてみると良いライブラリは phputf8 です。これは、すべての「悪い」関数を書き換えて、安全に UTF8 文字列を扱えるようにするものです。mbstring拡張のように、これを実現しようとする拡張機能もありますが、私はよりポータブルなライブラリを使いたいと思っています(ただし、私は大衆向けの製品を書いているので、それは私にとって重要なことです)。しかし、phputf8は、パフォーマンスを向上させるために、舞台裏でmbstringを使用することができます。