PHP と UTF-8 のベスト プラクティスの詳細な紹介

黄舟
リリース: 2023-03-06 11:56:01
オリジナル
1158 人が閲覧しました

「PHP の文字列、エンコーディング、UTF-8」という記事では、一連の基本的な知識について説明していますが、これは比較的退屈な内容です。この記事では、PHP の文字列処理のベスト プラクティスについて説明します。 UTF-8」、関連知識の第 2 部。まず結論 - PHP のあらゆる面で UTF-8 エンコーディングを使用します

PHP 言語レベルは Unicode 文字セットをサポートしていませんが、ほとんどの問題は UTF-8 エンコードによって解決できます。

ベスト プラクティスは、入力エンコーディングを明確に把握し (不明な場合は検出する)、それを内部で UTF-8 エンコーディングに均一に変換し、出力エンコーディングを UTF-8 エンコーディングに均一に変換することです。

PHPレベルで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.

ファイルIO操作で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 であることを確認します。次に、Mysql クライアントも接続時に UTF-8 を維持します。特に PHP では、imysql または PDO 拡張機能が Mysql に接続するときに、両方の側が一貫していれば、通常は問題は発生しません。

興味のある方はこちらの記事も読んでみてください

ブラウザと UTF-8 のベスト プラクティス

これも比較的単純です。つまり、出力コンテンツが 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() 関数の使用は推奨されません。長い間私を拷問しました。

オペレーティング システムと UTF-8 のベスト プラクティス

オペレーティング システムの理由により、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)!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!