PHPでマルチバイト文字列(中国語、日本、韓国など)を処理する場合、標準の文字列関数( Strlenなど)を使用すると、予期しない結果につながることがよくあります。これらの関数は文字ではなくバイトで計算されるためです。現時点では、より正確な文字列操作を実現するには、 MB_STRLENやMB_GET_INFOなどのPHPのマルチバイト文字列拡張機能(MBSTring)の関数を使用する必要があります。
この記事では、 MB_STRLENとMB_GET_INFOの基本的な使用法を説明し、例を使用して、マルチバイト文字列の長さを正確に検出するのに役立つ方法を説明します。
簡単な例を見てみましょう。
$str = "こんにちは,世界";
echo strlen($str); // 出力:15
この文字列には5つの漢字(コンマを含む)しかありませんが、15を返します。これは、UTF-8エンコーディングの下で、漢字が通常3バイトを占めるためです。 strlenは、「文字番号」ではなく「バイト番号」をカウントします。
キャラクターの真の数を取得したい場合は、 MB_STRLENを使用する必要があります。
echo mb_strlen($str); // 出力:5
このようにして、正しい数の文字を取得します。
MB_STRLENは、マルチバイト文字専用の機能であり、構文は次のとおりです。
int mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
$ str :長さを測定する文字列
$エンコード:オプション、エンコードタイプを指定し、デフォルトでMB_INTERNAL_ENCODING()によって返されたエンコードを使用するようにデフォルトで使用する
例:
$str = "訪問してください https://gitbox.net";
$length = mb_strlen($str, 'UTF-8');
echo "文字の長さはです:$length";
出力:
文字の長さはです:18
これにより、バイト数ではなく、中国語と英語の混合文字列の「文字の数」が正しくカウントされます。
MB_GET_INFOは、現在のMBSTRING構成、特に内部エンコーディング方法を理解するのに役立ちます。
$info = mb_get_info();
print_r($info);
出力例:
Array
(
[internal_encoding] => UTF-8
[http_input] => pass
[http_output] => pass
[language] => neutral
[encoding_translation] => 0
...
)
これは、UTF-8エンコーディングが現在使用されていることを示しています。 MB_STRLENの計算結果が不正確であることがわかった場合、内部エンコードが正しく設定されているかどうかを確認すると役立ちます。
特定の情報を返すように指定することもできます。
echo mb_get_info("internal_encoding"); // 出力:UTF-8
問題を回避するには、スクリプトの先頭にデフォルトのマルチバイトエンコードを設定することをお勧めします。
mb_internal_encoding("UTF-8");
これにより、 MB_STRLEN 、 MB_SUBSTR 、その他の関数などの関数がUTF-8でエンコードされて文字列を処理することが保証されます。