PHPでは、 STR_SPLITは、指定された長さで文字列を配列に分割する一般的に使用される文字列分割関数です。ただし、マルチバイトのキャラクター(中国語、日本、韓国など)に対処する場合、 STR_SPLITは、シングルバイトのキャラクターに基づいて設計されているため、いくつかの落とし穴をもたらす可能性があります。この記事では、Multibyte文字をSTR_SPLITで分割するときに遭遇する可能性のある問題について説明し、対応するソリューションを提供します。
デフォルトでは、 str_split関数は、指定された長さに応じて文字列を分割します。シングルバイト文字(ASCII文字など)の場合、これは問題ありませんが、マルチバイト文字の場合、 str_splitは文字を不完全なバイトシーケンスに分割し、したがって文字の正しさを破壊する可能性があります。
たとえば、次の文字列(中国語を含む)があるとします。
$str = "こんにちは,PHP!";
$split = str_split($str, 3);
print_r($split);
上記のコードを実行すると、私たちの期待は3つの文字ごとに文字列を分割することですが、各漢字は複数のバイトで構成されているため、 STR_SPLITは文字の中央で破壊され、文字が不完全になり、文字化されたコードさえもなります。
これらの問題を回避するために、次の方法を検討できます。
PHPは、マルチバイト文字セット拡張機能MB_STR_SPLITを提供します。これは、マルチバイト文字の処理に最適です。 MB_STR_SPLITは、文字列を文字(バイトではなく)で分割し、マルチバイト文字の分割問題によって引き起こされる落とし穴を回避します。
サンプルコード:
$str = "こんにちは,PHP!";
$split = mb_str_split($str, 3, 'UTF-8');
print_r($split);
このようにして、 MB_STR_SPLITは文字の実際の幅に従って削減され、各文字が間違って分割されないようにします。
MB_STR_SPLITが環境に適していない場合(PHPの低いバージョンなど)、 MB_Substrを使用して文字列を手動で分割することもできます。
サンプルコード:
$str = "こんにちは,PHP!";
$length = 3;
$chunks = [];
for ($i = 0; $i < mb_strlen($str, 'UTF-8'); $i += $length) {
$chunks[] = mb_substr($str, $i, $length, 'UTF-8');
}
print_r($chunks);
この例では、 MB_Substrを介して各サブストリングを徐々に取得し、マルチバイト文字が分割される状況を回避します。
STR_SPLITの使用を続けることにした場合は、少なくともMB_INTERNAL_ENCODINGを使用して正しい文字エンコードを設定してください。 STR_SPLIT自体は、マルチバイト文字のエンコーディング問題を自動的に処理しませんが、PHPが正しいエンコード(UTF-8など)を使用すると、潜在的な潜在的なガラス張りの問題を軽減できるようにします。
mb_internal_encoding("UTF-8");
$str = "こんにちは,PHP!";
$split = str_split($str, 3);
print_r($split);
これは、マルチバイトの文字分割の問題を完全に回避するわけではありませんが、処理されたときに文字のエンコードが予期しない変換を持たないことを保証します。
PHPを使用してマルチバイト文字を処理する場合、 STR_SPLIT関数は文字列を適切に分割していないため、腐敗または文字化された文字が発生します。これらの問題を回避するために、 MB_STR_SPLITやMB_SUBSTRなどのマルチバイト文字を特に扱う機能を使用できます。同時に、マルチバイト文字を処理する際には、キャラクターエンコーディングが正しく設定されることを確実にすることも良い習慣です。
これらの方法を使用することにより、マルチバイト文字をより安全に処理できるため、実際の開発で遭遇するトラップを回避できます。