サーチ…


備考

  • UTF-8文字列を処理するたびに、安全に行う必要があります。残念ながら、これは難しい部分です。おそらくPHPのmbstring拡張を広範囲に使いたいと思うでしょう。

  • PHPの組み込み文字列操作は、デフォルトではUTF-8ではありません通常のPHP文字列操作(連結など)で安全にできることがいくつかありますが、ほとんどの場合、同等のmbstring関数を使用する必要があります。

入力

  • 格納するか、どこにでも使用する前に、受信したすべての文字列を有効な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.inidefault_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'



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow