新しいサーバーをセットアップしており、Web アプリケーションで UTF-8 を完全にサポートしたいと考えています。以前に既存のサーバーでこれを試したことがありますが、常に ISO-8859-1 にフォールバックする必要がありました。
エンコーディング/文字セットはどこで設定する必要がありますか?これを実現するには、Apache、MySQL、および PHP を構成する必要があることはわかっていますが、従うことができる標準的なチェックリストはありますか、または不一致を除外できる場所はありますか?
これは、MySQL 5、PHP 5、および Apache 2 を実行する新しい Linux サーバーです。
chazomaticus の優れた回答に何か追加したいと思います
:META タグも忘れないでください (次のような、またはHTML4 または XHTML バージョン
):リーリー
これは些細なことのように思えるかもしれませんが、IE7 では以前に問題が発生しました。 すべてを正しく実行しています。データベース、データベース接続、および Content-Type HTTP ヘッダーはすべて UTF-8 に設定されており、他のすべてのブラウザでは問題なく動作しますが、Internet Explorer は依然として「西ヨーロッパ言語」を使用することを要求します。エンコーディング。 ページに META タグが欠落していることが判明しました。追加したら問題は解決しました。######編集:######W3C には実際には、I18N 専用のかなり大きなセクション
があります。この問題に関連する記事が多数あり、HTTP、(X)HTML、CSS の側面について説明しています:FAQ: (X)HTML ページのエンコーディングを UTF-8
######データストレージ###:###
データベース内のすべてのテーブルとテキスト列に
utf8mb4文字セットを指定します。これにより、MySQL は UTF-8 でエンコードされた値を物理的に保存および取得できるようになります。- utf8mb4_*
を使用する必要があります。冗談だったらよかったのに。
アプリケーション コード (PHP など) では、使用するデータベース アクセス方法に関係なく、接続文字セットを
utf8mb4照合順序が (明示的な文字セットなしで) 指定された場合、MySQL は暗黙的に
utf8mb4
エンコーディングを使用することに注意してください。MySQL の古いバージョン (utf8
######データアクセス###:###
に設定する必要があります。このように、MySQL はデータをアプリケーションに渡すとき、またはその逆のときにネイティブ UTF-8 への変換を行いません。
一部のドライバーは、接続文字セットを構成するための独自のメカニズムを提供します。これにより、ドライバー自身の内部状態が更新され、接続でエンコーディングを使用するように MySQL に通知されます。通常、これが推奨されるアプローチです。 PHP の場合: 抽象化レイヤーを使用している場合は、
- DSN
- ######出力###:###
(推奨) を設定するか、
PDOPHP 5.3.6 以降で
で
charsetを指定できます。- リーリー
:
- を呼び出すことができます。 リーリー
を呼び出すことができます。
。
mysqliを使用する場合は、
set_charset()
純粋なmysql
しか使用できないが、たまたま PHP 5.2.3 以上を実行している場合は、
mysql_set_charsetドライバーが接続文字セットを設定するための独自のメカニズムを提供していない場合は、クエリを発行して、接続上のデータをどのようにエンコードするかを MySQL アプリケーションに伝える必要がある場合があります。
セット名「utf8mb4」utf8mb4
/
utf8に関する上記と同じ考慮事項。
default_charsetUTF-8 は、HTTP ヘッダーに設定する必要があります (例:
Content-Type: text/html; charset=utf-8)。これを行うには、php.ini で
header()関数を手動で使用します。
アプリケーションが他のシステムにテキストを送信する場合は、文字エンコーディングも伝える必要があります。 Web アプリケーションの場合、データが送信されるエンコードをブラウザーに (HTTP 応答ヘッダーまたはHTML メタデータ- 経由で) 伝える必要があります。
- ブラウザはドキュメントで指定された文字セットでデータを送信するため、入力時に特別な処理は必要ありません。
- リクエストのエンコードに疑問がある場合 (改ざんされている可能性など)、受信した各文字列が有効な UTF-8 であることを確認してから、どこかに保存したり使用したりすることができます。 PHP の
json_encode()
を使用して出力をエンコードする場合は、2 番目のパラメーターとして
JSON_UNESCAPED_UNICODEを追加します。######入力###:###
mb_check_encoding()
はこれを行うことができますが、使用には厳密に注意する必要があります。悪意のあるクライアントは任意のエンコーディングでデータを送信できるため、この問題を回避する方法は実際にはありません。PHP にこれを確実に実行させる方法はまだ見つかりません。その他のコードのメモ:
明らかに、提供するすべてのファイル (PHP、HTML、JavaScript など) は有効な UTF-8 でエンコードされる必要があります。
UTF-8 文字列を処理するときは、必ず安全に行う必要があります。これは非常に難しい部分です。 PHP の
mbstring
拡張機能を広範囲に使用する必要がある場合があります。PHP の組み込み文字列操作は、デフォルトでは UTF-8 で安全ではありません。連結などの通常の PHP 文字列操作を使用して一部の操作を安全に実行できますが、ほとんどの操作では同等の
mbstring
関数を使用する必要があります。自分が何をしているのかを理解するには (つまり、台無しにしないでください)、UTF-8 とそれが最下位レベルでどのように機能するかを本当に理解する必要があります。utf8.comにあるリンクをチェックして、学習する必要があるすべての優れたリソースを入手してください。