PHPの言語レベルはUnicode文字セットをサポートしていませんが、ほとんどの問題はUTF-8エンコーディングで解決できます。
ベストプラクティスは、入力エンコーディングを明確に把握し(知らない場合は検出する)、内部で一律にUTF-8エンコーディングに変換し、出力エンコーディングも一律にUTF-8エンコーディングにすることです。
Unicode文字セットを操作する場合は、必ずmbstring拡張機能をインストールし、ネイティブ文字列関数の代わりに対応する関数を使用してください。たとえば、ファイルが UTF-8 PHP コードとしてエンコードされており、strlen() 関数を使用するのが間違っている場合は、代わりに mb_strlen() 関数を使用してください。
mbstring 拡張機能のほとんどの関数は、エンコーディング (内部エンコーディング) に基づいて処理する必要があります。これのほとんどは PHP.INI で設定できます。
PHP 5.6 以降、default_charset 設定で mbstring.http_input、mbstring.http_output を置き換えることができます。
もう 1 つの重要な設定は mbstring. language です。デフォルト値はニュートラル (UTF-8) です。
ファイルのエンコーディングとmbstring拡張子の内部エンコーディングは同じ概念ではないことに注意してください。
まとめると、
PHP.INI では、mbstring の拡張に関わる部分は可能な限り UTF-8 を使用しています。
ネイティブ文字列操作関数の代わりにmbstring拡張関数を使用してください。
関連関数を使用する場合は、操作する文字のエンコーディングを必ず理解してから、htmlentities()関数の第3引数などに記述されているUTF-8エンコーディングのパラメータを表示してください。 UTF-8で。
ここで例を示します。ファイルを開きたいが、ファイルの内容がどのようなエンコーディングであるかわからない場合、どう対処すればよいでしょうか。
ベストプラクティスは、開くときに一律にUTF-8に変換し、内容を変更した後に元のエンコーディングに戻してファイルに保存することです。コードを見てください:
if ( mb_internal_encoding()!="UTF-8") { mb_internal_encoding("UTF-8"); } $file = "file.txt"; //一个编码为gbk的中文文件 $str= file_get_contents($file); //不管来源是什么编码,统一显示的时候转换为 UTF-8 if (mb_check_encoding($str,"GBK")) $str = mb_convert_encoding($str,"UTF-8",“GBK”); $str ="修改内容"; $str = mb_convert_encoding($str,$srcbm,"UTF-8"); //原样转回去 file_put_contents($file,$str);
これは比較的簡単です。まず、Mysql が UTF-8 であることを確認します。次に、Mysql クライアントも接続時に UTF-8 を維持します。特に PHP では、imysql または PDO 拡張機能が Mysql に接続するときに、両方の側が一貫していれば、通常は問題は発生しません。
これも比較的単純です。つまり、出力コンテンツがWebページの場合、文字列処理の出力は常にUTF-8として維持される必要があります、同時にPHP。 .INI も、default_charset は明示的に UTF-8 に設定され、HTML のメタ タグも明確に UTF-8 としてマークされます。
これで大丈夫ですか? いいえ、サーバーとブラウザーではユーザーが UTF-8 エンコーディングを使用することを許可していますが、ユーザーは他のエンコーディングで文字を入力したり、ファイル名を他のエンコーディングでアップロードしたりする可能性があります。やるべきですか?ユーザーのエンコーディングは mb_http_input() 関数と mb_check_encoding() 関数によって検出され、内部で UTF-8 に変換されます。どのレベルでも、最終処理は UTF-8 エンコードであることを確認してください。つまり、入力がどのようなエンコーディングであるか、処理後のコントロール出力のエンコーディングが UTF-8 であるかを知る方法が必要です。
mbstring.encoding_translation ディレクティブと mb_detect_encoding() 関数の使用は推奨されません。長い間私を拷問しました。
オペレーティングシステムにより、PHPはUnicodeファイル名を処理する際の処理メカニズムが異なります。
Linux ではファイル名は常に UTF-8 でエンコードされますが、中国の Windows 環境ではファイル名は常に GBK でエンコードされます。これだけは覚えておいてください。
例で説明します:
//命令行程序函数,运行在中文版 Windows 10 操作系统 ,文件编码为 UTF-8 function filenameexample() { $filename = "测试.txt" ; $gbk_filename = iconv("UTF-8","GBK",$filename); file_put_contents($gbk_filename, "测试"); echo file_get_contents($gbk_filename); } function scandirexample() { $arr = scandir("./tmp"); foreach ($arr as $v) { if ($v == "." || $v =="..") continue ; $filename = iconv( "GBK","UTF-8",$v ) ; $content = file_get_contents("./tmp/" . $v ); } }
Windows と Linux と互換性のあるプログラムを書きたくない場合は、次のようにファイル名を URL コード化できます:
function urlencodeexample() { $filename = "测试2.txt" ; $urlencodefilename = urlencode($filename) ; file_put_contents($urlencodefilename, "测试"); echo file_get_contents($urlencodefilename); }
PHP を使用して次のことを行うときは、これも考慮する必要があります。 header() 関数を使用してファイルをダウンロードする ブラウザーとオペレーティング システム (ほとんどの人は Windows を使用します)、Chrome の場合、出力ファイル名のエンコーディングは UTF-8 にすることができ、Chrome はファイル名を GBK エンコーディングに自動的に変換します。
IE の下位バージョンの場合、オペレーティング システム環境を継承するため、ダウンロードされたファイル名が中国語の場合は、UTF-8 エンコードにトランスコードする必要があります。そうしないと、ダウンロード時にユーザーに文字化けしたファイル名が表示されます。コードで説明:
$agent=$_SERVER["HTTP_USER_AGENT"]; if(strpos($agent,'MSIE')!==false { $filename = iconv("UTF-8","GBK","附件.txt"); header("Content-Disposition: attachment; filename=\"$filename\""); }