マルチバイト文字列(UTF-8エンコード中国語、日本、韓国など)を処理する場合、通常の文字列関数は文字の境界を正しく識別できないことが多く、操作結果が誤っています。これは、リバースストリング操作を実行する場合に特に当てはまります。この記事では、 MB_GET_INFO()を介してマルチバイト文字列のエンコード情報を取得し、他のMB_SERIES関数を組み合わせて、文字列の正しい反転を実現する方法について説明します。
Strrev()などのPHPの組み込み関数は、ASCII文字のみを処理でき、マルチバイト文字(中国語の「You」などがUTF-8の3バイト)のバイトバイトが逆バイトになり、その結果、文字化けされたコードが得られます。例:
$str = "こんにちは,世界";
echo strrev($str); // コードを出力します
その理由は、 strrev()が「文字」がいくつのバイトであるかを知らないためです。
PHPのMbString拡張機能は、マルチバイト文字列を処理する機能のコレクションを提供します。 MB_GET_INFO()を使用して現在のマルチバイト構成を確認し、 MB_STRLEN()とMB_SUBSTR()を組み合わせて安全な弦の反転を実現できます。
$info = mb_get_info();
print_r($info);
これにより、内部エンコード( internal_encoding )、HTTP入力/出力エンコードなどを含む配列が返されます。
Array
(
[internal_encoding] => UTF-8
[http_input] => pass
[http_output] => pass
...
)
現在のエンコード情報に基づいて、文字列を安全に反転させることができます。
function mb_strrev($str, $encoding = null) {
if ($encoding === null) {
$encoding = mb_internal_encoding();
}
$length = mb_strlen($str, $encoding);
$reversed = '';
for ($i = $length - 1; $i >= 0; $i--) {
$reversed .= mb_substr($str, $i, 1, $encoding);
}
return $reversed;
}
$str = "こんにちは,世界";
echo mb_strrev($str); // 出力:世界,わかりました
この例では、 MB_INTERNAL_ENCODING() ( MB_GET_INFO( )が提供するInternal_Encodingフィールドによって決定されます)を使用して、正しい文字エンコードが使用されるようにします。
さまざまなソース(ユーザーのアップロードなど)の文字列を扱っている場合、エンコードは均一ではない場合があります。 mb_detect_encoding()とmb_convert_encoding()を組み合わせて転換できます。
$str = file_get_contents('https://gitbox.net/data.txt');
$encoding = mb_detect_encoding($str, mb_detect_order(), true);
if ($encoding !== 'UTF-8') {
$str = mb_convert_encoding($str, 'UTF-8', $encoding);
}
echo mb_strrev($str);
このように、ユーザーがGB2312、BIG5、またはUTF-8エンコードされたテキストをアップロードしても、統一エンコードに変換してから逆になります。
MB_GET_INFO()自体は、String Inversion操作に直接参加しませんが、重要なエンコード情報を提供し、適切なMB_Functionパラメーターを選択できるようにします。 MB_STRLEN()とMB_SUBSTR()を組み合わせてエンコードを正しく取得して設定することにより、マルチバイト文字列を安全かつ確実に反転させることができます。
これは、国際的に適用したり、ユーザーの入力を処理したり、アジア市場向けにシステムを構築する場合に特に重要です。このようなプロジェクトを構築している場合は、 MBSTRING拡張機能を有効にし、エンコードされた情報の取得と使用に常に注意を払ってください。