PHPのMB_STRCUTは、マルチバイト文字(中国語など)を扱うときに非常に実用的な機能です。切り捨てられた文字によるコードの問題を避けるために、マルチバイト文字列を安全に傍受するために使用されます。ただし、多くの開発者は、 MB_STRCUTを使用する場合、いくつかの一般的な落とし穴とエラーに遭遇します。この記事では、機能を正しく使用する方法を詳細に紹介し、一般的な問題の解決策を指摘します。
質問を掘り下げる前に、まず一般的な誤解を明確にしましょう。MB_STRCUTとMB_SUBSTRは似ていますが、その行動は非常に異なります。
MB_SUBSTRは、「文字」、つまり、指定された数の文字を傍受することに基づいて傍受されます。
MB_STRCUTは、「バイト」に基づくインターセプトです。バイトの位置から始まるいくつかのバイトを傍受しようとし、文字の完全性を破壊しないようにしようとします。
これは、中国語を処理する場合(通常、UTF-8は次の漢字を3バイトにエンコードする)、バイトの位置と長さを不正確に計算すると、文字の中央で切り捨てられ、その結果、文字化けの出力が生じる可能性があることを意味します。
中国の文字列を傍受し、バイトの不一致のためにキャラクターが破損していないことを確認する必要があるとします。
<?php
$str = "訪問してくださいgitbox.net,これはデモンストレーションのための中国語の文字列です。";
$cutStr = mb_strcut($str, 0, 18, "UTF-8");
echo $cutStr;
?>
上記のコードは、最初の18バイトを傍受することを目的としています。しかし、注意:
文字列に中国語(漢字の3バイト)が含まれている場合、18バイトは文字の中央で切り捨てられる可能性があります。
MB_STRCUTは、キャラクターの切り捨てを避けようとしますが、その動作は使用されるエンコーディングに依存します。
したがって、 MB_STRCUTの4番目のパラメーター(エンコード)を正しく指定する必要があることを確認してください。通常は「UTF-8」です。
これが最も一般的な問題です。理由は通常次のとおりです。
正しいエンコードは設定されていません。
インターセプトの開始位置または長さにより、キャラクターが切り捨てられます。
解決:
常にUTF-8エンコーディングを使用し、出力環境(HTMLページなど)もUTF-8であることを確認してください。
header("Content-Type: text/html; charset=utf-8");
たとえば、「10バイト」ではなく「10文字」を表示する場合、 MB_STRCUTはバイトに基づいているため適用されません。 MB_SUBSTRを使用する必要があります。
$cutStr = mb_substr($str, 0, 10, "UTF-8");
中央からバイトの傍受を開始すると(たとえば、5番目のバイトから始まる)、キャラクターの真ん中に落ちて、傍受障害または出力の例外が生じる可能性があります。
提案:
(バイトオフセットではなく)文字境界から可能な限りインターセプトします。
バイトに基づいて動作する必要がある場合は、最初にMB_STRCUTを使用して出力効果を徐々にテストできます。
繰り返しの間違いを避けるために、中国の文字列を安全に傍受する関数をカプセル化できます。
function safeCutStr($string, $length, $charset = "UTF-8") {
return mb_strcut($string, 0, $length, $charset);
}
ページ出力の前に、後処理を追加して、最後の文字が完了したかどうかを判断し、必要に応じて不完全な文字を省略することもできます。
中国語などのマルチバイト文字セットを扱う場合、 MB_STRCUTを使用すると、傍受効率が向上する可能性がありますが、バイトと文字の関係についても十分に注意する必要があります。できるだけ文字化けしたコードの問題を回避するために:
常に正しいエンコード(UTF-8など)を指定します。
MB_Substrを使用して、文字を傍受するために可能な限り使用します。
バイトで傍受する必要がある場合は、カプセル化フォールトトレランスロジックを検討してください。
MB_STRCUTを合理的に使用すると、中国語の処理時にPHPプログラムをより堅牢で安定させることができます。