PHPの一般的な文字列操作関数STR_SPLITとMB_STR_SPLITは、指定された長さによって文字列を配列に分割するために使用されますが、それらの作業原則は非常に異なります。マルチバイト文字セット(UTF-8エンコーディングなど)を扱う場合、 STR_SPLITにはいくつかの制限があり、 MB_STR_SPLITを使用する方が適切です。この記事では、2つの機能の違いと、 STR_SPLITの代わりにMB_STR_SPLITを選択する必要がある状況の下で説明します。
まず、 STR_SPLITとMB_STR_SPLITの基本的な機能と使用法をすばやく確認しましょう。
str_split :文字列を指定された長さの配列に分割するために使用されます。これは、PHPに組み込みの文字列操作機能であり、ASCII文字セットに適しており、マルチバイト文字を正しく処理できません。
例:
$str = "Hello World";
$result = str_split($str, 2); // 戻る:['He', 'll', 'o ', 'Wo', 'rl', 'd']
MB_STR_SPLIT :文字によって文字列を分割するために使用されるマルチバイト文字列拡張機能(MBSTring)の関数であり、UTF-8またはその他のマルチバイト文字エンコードを正しく処理できます。
例:
$str = "こんにちは,世境界";
$result = mb_str_split($str, 1); // 戻る:['あなた', '良い', ',', '世', '境界']
STR_SPLIT関数の主な問題の1つは、マルチバイト文字セットをサポートしていないことです。たとえば、UTF-8エンコーディングでは、漢字が複数のバイトを占有し、 STR_SPLITは文字ではなくバイトで文字列を分割します。これにより、マルチバイト文字(漢字、日本語文字など)を含む文字列を適切に処理しません。
次の例を考えてみましょう。
$str = "こんにちは";
$result = str_split($str, 1);
print_r($result);
出力は次のとおりです。
Array
(
[0] => "あなた"
[1] => "良い"
)
問題はないように思えますが、実際にはstr_splitは文字列ではなくバイトで文字列を分割します。マルチバイト文字が文字列に含まれている場合、 STR_SPLITは、不必要な文字化けまたは誤った結果になる場合があります。
MB_STR_SPLITは、マルチバイト文字セット専用に設計されています。 UTF-8、GBK、またはその他の文字エンコーディングであろうと、マルチバイト文字を正しく認識して分割します。 MB_STR_SPLITを使用することにより、文字列がバイトではなく文字によって分割されることを確認できます。
上記の例を見続けます:
$str = "こんにちは";
$result = mb_str_split($str, 1);
print_r($result);
出力の結果は次のとおりです。
Array
(
[0] => "あなた"
[1] => "良い"
)
この時点で、 MB_STR_SPLITは、バイトレベルのセグメンテーションの問題なしに、文字列を文字と要素の配列に正しく分割できます。
プロジェクトにマルチバイト文字セット(UTF-8エンコード中国語、日本、韓国など)が含まれる場合は、文字列を分割するときはMB_STR_SPLITを使用する必要があります。特に、ユーザー入力、データの保存、または多言語コンテンツが関連するシナリオでは、 str_splitを使用すると不必要な問題が発生する可能性があります。
ここにいくつかのシナリオがあります。MB_STR_SPLITを使用することをお勧めします。
プロセス多言語コンテンツ:中国語、日本、韓国語、その他のマルチバイトキャラクターセットなど。
ユーザー入力:ユーザーが入力したテキストにはマルチバイト文字が含まれている可能性があるため、 MB_STR_SPLITを使用する方が安全です。
文字列エンコード変換:文字エンコードと文字列を文字で分割する必要がある場合、 MB_STR_SPLITはよりよく互換性を確保できます。
MB_STR_SPLITは、マルチバイト文字を扱う際により良い互換性を提供しますが、文字エンコードとマルチバイト文字を処理する必要があるため、そのパフォーマンスはSTR_SPLITよりもわずかに悪化しています。特に大量のテキストデータが関係する場合、大規模な文字列処理にはパフォーマンステストと最適化が必要になる場合があります。
単純なASCII文字列の場合、 STR_SPLITの方が効率的になる場合がありますが、マルチバイト文字に要件がある場合は、 MB_STR_SPLITを使用する方が安全なオプションです。
str_split :ASCII文字列で動作し、マルチバイト文字を正しく処理できません。
MB_STR_SPLIT :マルチバイト文字セット(UTF-8エンコーディングなど)に適しています。これは、マルチバイト文字を含む文字列を正しく処理できます。
マルチバイト文字セットに対処する必要がある場合は、 MB_STR_SPLITの使用を優先順位付けして、エンコードの問題によって引き起こされるエラーや矛盾を避ける必要があります。文字列にシングルバイト文字のみが含まれていると確信している場合、 STR_SPLITはより軽いオプションです。
この記事が、マルチバイト文字列処理で正しい分割関数を選択する方法を理解するのに役立つことを願っています。