新しいサーバーをセットアップしており、Web アプリケーションで UTF-8 を完全にサポートしたいと考えています。 以前、既存のサーバーでこれを試したことがありますが、結局 ISO-8859-1 にフォールバックしなければならないようです。
エンコード/文字セットはどこで設定する必要がありますか? これを行うには、Apache、MySQL、および PHP を構成する必要があることはわかっています。従うことができる標準的なチェックリストはありますか? または、不一致が発生する場所をトラブルシューティングする方法はありますか?
これは、MySQL 5、PHP 5、Apache 2 を実行する新しい Linux サーバー用です。
ベストアンサー1
データストレージ:
utf8mb4
データベース内のすべてのテーブルとテキスト列の文字セットを指定します。これにより、MySQL は UTF-8 でネイティブにエンコードされた値を物理的に保存および取得します。照合が指定されているutf8mb4
場合 (明示的な文字セットなし)、MySQL は暗黙的にエンコードを使用することに注意してくださいutf8mb4_*
。MySQL の古いバージョン (< 5.5.3) では、残念ながら、Unicode 文字のサブセットのみをサポートする を単純に使用する必要があります
utf8
。冗談だったらよかったのですが。
データアクセス:
アプリケーション コード (PHP など) では、使用する DB アクセス メソッドに関係なく、接続文字セットを に設定する必要があります
utf8mb4
。この方法では、MySQL はデータをアプリケーションに渡すときにネイティブ UTF-8 から変換せず、その逆も同様です。一部のドライバは、接続文字セットを構成するための独自のメカニズムを提供します。このメカニズムは、ドライバ自身の内部状態を更新し、接続で使用するエンコードを MySQL に通知します。これは通常、推奨される方法です。PHP の場合:
を使用している場合はPDOPHP ≥ 5.3.6の抽象化レイヤーでは
charset
、DSSN の:$dbh = new PDO('mysql:charset=utf8mb4');
使用している場合mysqli、電話をかけることができます
set_charset()
:$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
プレーンなものにこだわるならマイスクしかし、PHP ≥ 5.2.3を実行している場合は、
mysql_set_charset
。
ドライバーが接続文字セットを設定するための独自のメカニズムを提供しない場合は、接続時のデータがどのようにエンコードされるかをアプリケーションが期待しているかを MySQL に伝えるクエリを発行する必要がある場合があります。
SET NAMES 'utf8mb4'
。utf8mb4
/に関しては上記と同じ考慮事項utf8
が適用されます。
出力:
- UTF-8はHTTPヘッダーで設定する必要があります
Content-Type: text/html; charset=utf-8
。これは、次のように設定することで実現できます。default_charset
php.ini 内(推奨)、またはheader()
関数を使用して手動で指定します。 - アプリケーションが他のシステムにテキストを送信する場合、文字エンコーディングも通知する必要があります。Webアプリケーションでは、データが送信されるエンコーディングをブラウザに通知する必要があります(HTTPレスポンスヘッダーまたはHTML メタデータ)。
- を使用して出力をエンコードする場合は
json_encode()
、JSON_UNESCAPED_UNICODE
2 番目のパラメータとして を追加します。
入力:
- ブラウザはドキュメントに指定された文字セットでデータを送信するため、入力時に特別な操作を行う必要はありません。
- リクエストのエンコーディングに疑問がある場合(改ざんされる可能性がある場合)、受信した文字列を保存したりどこかで使用したりする前に、その文字列が有効なUTF-8であることを確認することができます。PHPの
mb_check_encoding()
うまくいきますが、これを忠実に使用する必要があります。悪意のあるクライアントは任意のエンコードでデータを送信できるため、これを回避する方法は実際にはありません。また、PHP でこれを確実に実行するためのトリックは見つかりませんでした。
その他のコードに関する考慮事項:
当然のことですが、提供するすべてのファイル (PHP、HTML、JavaScript など) は、有効な UTF-8 でエンコードする必要があります。
UTF-8文字列を処理するときは、必ず安全に処理する必要があります。残念ながら、これが難しい部分です。PHPの
mbstring
拡大。PHP の組み込み文字列操作は、デフォルトでは UTF-8 セーフではありません。通常の PHP 文字列操作 (連結など) で安全に実行できる操作もありますが、ほとんどの場合は同等の関数を使用する必要があります
mbstring
。何をしているかを知るには(つまり、台無しにしないためには)、UTF-8とその仕組みをできるだけ低いレベルで知る必要があります。utf8.com必要な知識をすべて学ぶための優れたリソースです。