「PHP の文字列、エンコーディング、UTF-8」という記事では、一連の基本的な知識について説明していますが、これは比較的退屈な内容です。この記事では、PHP の文字列処理のベスト プラクティスについて説明します。 UTF-8」、関連知識の第 2 部。まず結論 - PHP のあらゆる面で UTF-8 エンコーディングを使用します。
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 拡張子の内部エンコーディングは同じ概念ではないことに注意してください。
一言で言えば:
mbstring 拡張子に関係する PHP.INI の部分では、可能な限り UTF-8 を使用する必要があります。
ネイティブの文字列操作関数ではなく、mbstring 拡張関数を使用してください。
関連関数を使用する場合は、操作する文字のエンコーディングを理解してください。たとえば、htmlentities() 関数の 3 番目のパラメーターは、UTF-8 で表示されます。 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 はファイル名を自動的に UTF-8 に変換します。 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\""); }
以上就是详细介绍PHP 与 UTF-8的最佳实践的内容,更多相关内容请关注PHP中文网(www.php.cn)!