データ ストレージ :
-
utf8mb4
を指定 データベース内のすべてのテーブルとテキスト列の文字セット。これにより、MySQL は UTF-8 でネイティブにエンコードされた値を物理的に格納および取得します。 MySQL は暗黙的にutf8mb4
を使用することに注意してください。utf8mb4_*
の場合のエンコーディング 照合が指定されています (明示的な文字セットなし)。 -
古いバージョンの MySQL (<5.5.3) では、残念ながら単純に
utf8
を使用する必要があります。 Unicode 文字のサブセットのみをサポートします。冗談だったらいいのに。
データ アクセス :
-
アプリケーション コード (PHP など) では、使用する DB アクセス方法に関係なく、接続文字セットを
utf8mb4
に設定する必要があります。 .このように、MySQL はアプリケーションにデータを渡すときにネイティブ UTF-8 からの変換を行わず、その逆も行いません。 -
一部のドライバーは、接続文字セットを構成するための独自のメカニズムを提供します。これにより、独自の内部状態が更新され、接続で使用されるエンコーディングが MySQL に通知されます。通常、これが推奨される方法です。 PHP の場合:
-
PHP ⥠5.3.6 で PDO 抽象化レイヤーを使用している場合は、
charset
を指定できます。 DSN:$dbh = new PDO('mysql:charset=utf8mb4');
-
mysqli を使用している場合は、
set_charset()
を呼び出すことができます :$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
単純な mysql で行き詰まっているが、たまたま PHP … 5.2.3 を実行している場合は、
mysql_set_charset
を呼び出すことができます。 .
-
-
ドライバが接続文字セットを設定するための独自のメカニズムを提供していない場合は、アプリケーションが接続上のデータがエンコードされることを期待する方法を MySQL に伝えるクエリを発行する必要がある場合があります:
SET NAMES 'utf8mb4'
. -
utf8mb4
に関する同じ考慮事項 /utf8
上記のように適用されます。
出力 :
Content-Type: text/html; charset=utf-8
のように、HTTP ヘッダーに UTF-8 を設定する必要があります。 .default_charset
を設定することで実現できます php.ini で (推奨)、またはheader()
を使用して手動で 関数。- アプリケーションがテキストを他のシステムに送信する場合は、文字エンコーディングも通知する必要があります。ウェブ アプリケーションでは、データが送信されるエンコーディングをブラウザに通知する必要があります (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 のリンクをチェックして、知っておくべきことをすべて学ぶための優れたリソースを確認してください。
default_charset
の設定に加えて php.ini では、header()
を使用して正しい文字セットを送信できます。 コード内から、出力の前に:
header('Content-Type: text/html; charset=utf-8');
ほとんどの文字列関数は Unicode では機能せず、文字列を完全に破壊するものもあることを理解していれば、PHP で Unicode を扱うのは簡単です。 . PHP は、「文字」の長さを 1 バイトと見なします。これで問題ない場合もあります (たとえば、explode() はバイト シーケンスのみを検索し、それをセパレータとして使用します。そのため、検索する実際の文字は問題になりません)。ただし、関数が実際に文字で動作するように設計されている場合もあります 、PHP は、テキストに Unicode で検出されるマルチバイト文字が含まれていることを認識していません。
チェックインするのに適したライブラリは、phputf8 です。これにより、すべての「悪い」関数が書き直され、UTF8 文字列を安全に操作できるようになります。 mb_string 拡張機能のような拡張機能もありますが、移植性が高いため、ライブラリを使用することを好みます (しかし、私はマスマーケット向けの製品を作成しているので、それは私にとって重要です)。しかし、phputf8 はパフォーマンスを向上させるために舞台裏で mb_string を使用できます。
chazomaticus の優れた回答に 1 つ追加したいと思います:
META タグも忘れないでください (このように、またはその HTML4 または XHTML バージョン):
<meta charset="utf-8">
些細なことのように思えますが、IE7 では以前に問題が発生しました。
私はすべてを正しく行っていました。データベース、データベース接続、および Content-Type HTTP ヘッダーはすべて UTF-8 に設定されており、他のすべてのブラウザーでは問題なく動作しましたが、Internet Explorer は依然として「西ヨーロッパ」エンコーディングの使用を主張していました。
ページに META タグがないことが判明しました。それを追加すると問題が解決しました。
編集:
W3C には、実際には I18N 専用のかなり大きなセクションがあります。この問題に関連する多くの記事があり、HTTP、(X)HTML、および CSS の側面について説明しています:
- よくある質問:(X)HTML ページのエンコーディングを UTF-8 に変更する
- HTML での文字エンコーディングの宣言
- チュートリアル:XHTML、HTML、CSS の文字セットとエンコーディング
- HTTP 文字セット パラメータの設定
HTTP ヘッダーと HTML メタ タグ (XML として提供される XHTML の場合は XML 宣言) の両方を使用することをお勧めします。