サーチ…
備考
入力
格納するか、どこにでも使用する前に、受信したすべての文字列を有効なUTF-8として検証する必要があります。 PHPの
mb_check_encoding()
はそのトリックを行いますが、それを一貫して使用する必要があります。悪意のあるクライアントは、必要なエンコーディングでデータを送信できるため、これを回避する方法はまったくありません。$string = $_REQUEST['user_comment']; if (!mb_check_encoding($string, 'UTF-8')) { // the string is not UTF-8, so re-encode it. $actualEncoding = mb_detect_encoding($string); $string = mb_convert_encoding($string, 'UTF-8', $actualEncoding); }
HTML5を使用している場合は、この最後の点を無視できます。ブラウザから送信されるすべてのデータがUTF-8になるようにしたいとします。これを行う信頼できる唯一の方法は、すべての
<form>
タグにaccept-charset
属性を追加するaccept-charset
です:<form action="somepage.php" accept-charset="UTF-8">
出力
アプリケーションがテキストを他のシステムに送信する場合は、文字エンコーディングも通知する必要があります。 PHPでは、
php.ini
のdefault_charset
オプションを使用するか、手動でContent-Type
MIMEヘッダーを手動で発行することができます。現代のブラウザをターゲットとする場合は、これが望ましい方法です。header('Content-Type: text/html; charset=utf-8');
応答ヘッダーを設定できない場合は、 HTMLメタデータを使用してHTML文書のエンコードを設定することもできます 。
HTML5
<meta charset="utf-8">
古いバージョンのHTML
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
データの保存とアクセス
このトピックでは、特にUTF-8とデータベースでの使用に関する考慮事項について説明します。 PHPでデータベースを使用する方法の詳細については、 このトピックをチェックアウトしてください 。
MySQLデータベースへのデータの格納:
- データベースのすべてのテーブルおよびテキスト列に
utf8mb4
文字セットを指定します。これにより、MySQLは物理的にUTF-8でコード化された値を物理的に格納して取得します。utf8mb4_*
照合が指定されている場合(明示的な文字セットなし)、MySQLは暗黙的にutf8mb4
エンコーディングを使用します。 - 古いバージョンのMySQL(5.5.3)は
utf8mb4
サポートしていないので、Unicode文字のサブセットのみをサポートするutf8
を使用するutf8
があります。
MySQLデータベースのデータへのアクセス:
アプリケーションコード(PHPなど)では、使用するDBアクセスメソッドによって、接続文字セットを
utf8mb4
に設定する必要があります。このようにして、MySQLはネイティブのUTF-8からデータをアプリケーションに渡したり、その逆に変換することはありません。ドライバによっては、接続文字セットを設定するための独自のメカニズムが用意されています。接続文字セットは、内部状態を更新し、接続に使用するエンコーディングをMySQLに通知します。これは、通常、好ましいアプローチです。
例(
utf8mb4
/utf8
に関する上記と同じ考慮事項が上記と同じです):PHP≥5.3.6のPDO抽象レイヤーを使用している場合は、 DSNで
charset
を指定できます。$handle = new PDO('mysql:charset=utf8mb4');
mysqliを使用している場合、
set_charset()
呼び出すことができます:$conn = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db'); $conn->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($conn, 'utf8mb4'); // procedural style
プレーンなmysqlに
mysql_set_charset
ても、PHP 5.2.3以上で動いている場合は、mysql_set_charset
を呼び出すことができます。$conn = mysql_connect('localhost', 'my_user', 'my_password'); $conn->set_charset('utf8mb4'); // object oriented style mysql_set_charset($conn, 'utf8mb4'); // procedural style
データベースドライバが接続文字セットを設定するための独自のメカニズムを提供していない場合は、接続上のデータがどのようにエンコードされるかをMySQLに指示するためにクエリを発行する必要があるかもしれません:
SET NAMES 'utf8mb4'
。