新しいサーバーをセットアップしており、Web アプリケーションで UTF-8 を完全にサポートしたいと考えています。過去に既存のサーバーでこれを試してみましたが、常に最終的に ISO-8859-1 にフォールバックする必要があるようでした。
エンコーディング/文字セットは正確にどこで設定する必要がありますか?これを行うには、Apache、MySQL、および PHP を構成する必要があることはわかっています。従うことができる標準的なチェックリストはありますか、または不一致が発生した場合のトラブルシューティングは可能ですか?
これは、MySQL 5、PHP、5、および Apache 2 を実行する新しい Linux サーバーに適用されます。
chazomaticus の素晴らしい回答 一个> に 1 つ追加したいことがあります:
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 は暗黙的に
utf8utf8mb4
エンコーディングを使用することに注意してください。MySQL の古いバージョン (5.5.3 未満) では、残念ながら、Unicode 文字のサブセットのみをサポートする
######データアクセス###:###
に設定する必要があります。こうすることで、MySQL がアプリケーションにデータを渡すときに、ネイティブ UTF-8 から変換したり、その逆の変換をしたりすることはありません。
一部のドライバーは、接続文字セットを構成するための独自のメカニズムを提供します。これにより、ドライバー自体の内部状態が更新され、接続で使用するエンコーディングが MySQL に通知されます。通常、これが推奨されるアプローチです。 PHP の場合:-
PDO 抽象化レイヤーを使用している場合は、DSN:-
-
######出力###:###
default_charset
を設定するか (推奨)、PHP 5.3.6 以降で
リーリー-
.- を呼び出すことができます。
。
mysqli プレーンな mysql
を使用したいが、偶然 PHP 5.2.3 以上を実行している場合は、
mysql_set_charsetドライバーが接続文字セットを設定するための独自のメカニズムを提供していない場合は、アプリケーションが接続上のデータがどのようにエンコードされることを想定しているかを MySQL に伝えるクエリを発行する必要がある場合があります。 代码>
SET NAME 'utf8mb4 '上で説明したように、同じ考慮事項が utf8mb4
/
utf8 にも当てはまります。UTF-8 は、
Content-Type: text/html;character set = utf-8のように、HTTP ヘッダーに設定する必要があります。これを行うには、php.ini で
header() 関数を手動で使用します。
アプリケーションが他のシステムにテキストを転送する場合、文字エンコーディングも認識している必要があります。 Web アプリケーションの場合、データを送信するエンコーディングをブラウザーに (HTTP 応答ヘッダーまたはHTML メタデータ- 経由で) 伝える必要があります。
json_encode()
######入力###:###- ブラウザはドキュメントで指定された文字セットのデータを送信するため、入力を特別に操作する必要はありません。
- リクエストのエンコードに疑問がある場合 (改ざんされている可能性があるため)、受信した各文字列が有効な UTF-8 であることを確認してから、それを保存したりどこかに使用したりすることができます。 PHP の
-
-
-
を使用して出力をエンコードする場合は、2 番目のパラメーターとして code>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 のリンクをチェックしてください。 p>