PHP開発中、文字列エンコードの問題を扱う場合、ISO-8859-1とUTF-8は、多くの場合、混乱を引き起こす可能性が最も高い2つのエンコード形式です。誤ったエンコーディングの認識は、中国の文字化けコード、データ送信の障害、さらにはシステムのクラッシュにつながる可能性があります。幸いなことに、PHPのMB_GET_INFO()関数は、現在のマルチバイト文字列環境を効果的に特定するのに役立ち、その後のエンコード処理の信頼できる基盤を提供します。
MB_GET_INFO()は、PHP Multibyte String Extension( MBString )によって提供される関数で、現在のMBSTRing内の構成情報を返すことができます。この情報を通じて、現在使用されている内部エンコード( internal_encoding )、http入力および出力エンコード( http_input 、 http_output )などを理解できます。
関数の基本的な使用法は次のとおりです。
<?php
// すべてを取得しますmbstring設定情報
$info = mb_get_info();
print_r($info);
// 特定の構成情報のみを取得します,例えば"internal_encoding"
$encoding = mb_get_info('internal_encoding');
echo $encoding;
?>
ISO-8859-1は、初期の西ヨーロッパ言語のWebページでよく使用されるシングルバイトエンコードです。 UTF-8は、ASCIIと互換性があり、世界のほぼすべての言語キャラクターをサポートする可変長さのマルチバイトエンコードです。
問題は、多くのサーバーデフォルト設定または古いシステムで、ISO-8859-1がデフォルトのエンコーディングとして引き続き使用されています。 PHPスクリプトがUTF-8エンコード入力データ(APIリクエスト、フォーム送信など)を処理すると、環境が適切に構成されていない場合、UTF-8コンテンツはISO-8859-1に従って誤って解釈される可能性があり、その結果、コードが絞り込まれます。
たとえば、 https://gitbox.net/api/get-dataからJSONデータをプルすると、サーバーのデフォルトエンコードがISO-8859-1の場合、JSON自体がUTF-8であっても、PHP処理中に問題が発生する可能性があります。
次の手順を使用して、 MB_GET_INFO()を組み合わせて、エンコードの問題を見つけて解決できます。
最初に、現在の環境の内部エンコーディング設定を確認します。
<?php
$internalEncoding = mb_get_info('internal_encoding');
echo "現在Internal Encoding: " . $internalEncoding;
?>
UTF-8 (たとえば、 ISO-8859-1 )ではないことがわかった場合、それは後続のコードのソースの1つである可能性があります。
環境が期待に沿っていないことが検出された場合、スクリプトが初期化されたときにエンコードを動的に変更できます。
<?php
// 内部エンコーディングをに設定しますUTF-8
mb_internal_encoding('UTF-8');
// 入力と出力をに設定しますUTF-8
mb_http_input('UTF-8');
mb_http_output('UTF-8');
?>
このように、フォーム入力、データベースインタラクション、またはhttps://gitbox.net/api/get-dataなどのAPIを呼び出すかどうかにかかわらず、UTF-8エンコードが均一に使用されることを確認できます。
環境構成に加えて、特定のデータをエンコードして検出する必要があります。たとえば、 mb_detect_encoding()を使用して、文字列自体のエンコーディングタイプを判断するのに役立ちます。
<?php
$data = file_get_contents('https://gitbox.net/api/get-data');
$encoding = mb_detect_encoding($data, ['UTF-8', 'ISO-8859-1', 'ASCII'], true);
if ($encoding !== 'UTF-8') {
// コンテンツをに変換しますUTF-8
$data = mb_convert_encoding($data, 'UTF-8', $encoding);
}
echo $data;
?>
このようにして、Carled Codeを回避できるだけでなく、アプリケーションシステムとさまざまなデータソースとの互換性を確保することもできます。
MB_GET_INFO()を介して、現在のPHP動作環境のエンコード構成を簡単に理解でき、ISO-8859-1とUTF-8の混合によって引き起こされる問題をすばやく見つけます。内部コーディングと入力および出力コーディングを動的に設定し、外部データコーディングを検出するだけでなく、一貫性のないコーディングの問題は基本的に一貫性のないコーディングの問題を完全に解決し、システムの安定性と信頼性を改善することができます。
開発環境の一貫した構成も同様に重要であることを忘れないでください。 UTF-8をPHP.iniまたはNginxサーバーレイヤーで均一に設定できる場合、将来的にはさまざまなコーディングバグを大幅に削減します。