PHP開発では、マルチバイト文字列の処理は一般的でエラーが発生しやすいリンクです。特に文字列の傍受に関しては、マルチバイト文字を傍受するときに文字化けした問題を回避するために、 substの代わりにMB_STRCUT関数が頻繁に使用されます。ただし、多くの開発者は、 MB_STRCUTのバイトと文字の違いについて疑問を抱いています。この記事では、この2つの違いを詳細に分析して、機能をよりよく理解して使用するのに役立ちます。
MB_STRCUTは、文字列の一部を傍受するために使用されるPHP Multibyte String Function Library Mbstringの関数です。
string mb_strcut ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )
$ str :文字列を入力します
$ start :開始位置、ユニットはbyte(byte)
$ length :長さをインターセプトし、ユニットもバイトです(オプション)
$エンコード:文字列エンコード、デフォルトで内部エンコード
バイト:コンピューター内のデータストレージの基本単位、1バイト= 8ビット。バイトは英語の文字を表すことができますが、漢字や他のマルチバイト文字の場合、多くの場合、複数のバイトが必要です。
文字:占有するバイトの数に関係なく、完全な「シンボル」を指します。
たとえば、UTF-8エンコーディングでは、漢字は通常3バイトを占め、英語の文字は1バイトを占めています。
MB_STRCUTの重要なポイントは、 $ startと$ lengthパラメーターが両方ともバイトであり、これは文字内の他の関数( MB_Substrなど)とは異なることです。
つまり、3番目の文字から始まる5文字をインターセプトしたい場合、 MB_STRCUTを使用するには、各文字が占めるバイト数を計算する必要があります。文字インデックス作成を直接使用すると、インターセプトエラーが発生し、マルチバイト文字の半分をインターセプトして、コードを引き起こします。
MB_STRCUTの利点は、マルチバイト文字の中央部分が切り捨てられないことを保証することです。傍受すると、 MB_STRCUTは、文字の一部が切り捨てられ、文字化けコードが出力されないように境界を自動的に調整します。
例えば:
<?php
$str = "こんにちは,world!"; // "こんにちは"2つの漢字,英語と感嘆符が続きます
echo mb_strcut($str, 0, 6, "UTF-8");
?>
上記のコードでは、 6バイトの長さは、2つの漢字「You」と「Good」(漢字ごとに3バイト)のバイト数です。 MB_STRCUTは、キャラクターの半分を切り取ることなく、これら2つの漢字を正しく傍受します。
文字でsubstrまたはインターセプト関数を使用する場合、バイトが切り捨てられて、文字化けコードを引き起こす可能性があります。
MB_STRCUTのバイト単位を理解した後、 MB_STRLENとMB_SUBSTRを使用して、バイト数の計算を支援できます。例えば:
<?php
$str = "こんにちは,world!";
$encoding = "UTF-8";
for ($i = 0; $i < mb_strlen($str, $encoding); $i++) {
$char = mb_substr($str, $i, 1, $encoding);
$byteLen = strlen(mb_convert_encoding($char, "UTF-8", $encoding));
echo "キャラクター {$char} 占有されているバイト数: {$byteLen}\n";
}
?>
出力:
キャラクター あなた 占有されているバイト数: 3
キャラクター 良い 占有されているバイト数: 3
キャラクター , 占有されているバイト数: 3
キャラクター w 占有されているバイト数: 1
キャラクター o 占有されているバイト数: 1
キャラクター r 占有されているバイト数: 1
キャラクター l 占有されているバイト数: 1
キャラクター d 占有されているバイト数: 1
キャラクター ! 占有されているバイト数: 3
これは、マルチバイト文字がUTF-8の複数のバイトを占めることを示しています。
バイトの長さに基づいて文字列を切り捨て、マルチバイト文字が中央で切り捨てられないようにする場合は、 MB_STRCUTを使用する必要があります。
文字数に基づいて文字列をインターセプトする場合(各文字が撮影するバイトの数に関係なく)、 MB_Substrを使用する必要があります。
必ず正しいエンコードを指定してください。そうしないと、バイト計算がエラーである可能性があります。
ネットワークトランスミッション、データベースストレージ、またはファイル操作では、文字列のバイトの長さが文字の長さよりも重要であり、 MB_STRCUTは現時点では非常に実用的です。
バイトと文字の違いに慣れていない場合は、切り捨てられた例外とコードの問題が発生しやすくなります。
<?php
// サンプルコード:使用mb_strcutインターセプトUTF-8编码キャラクター串的前6バイト(对应2つの漢字)
$str = "こんにちは,world!";
$cutStr = mb_strcut($str, 0, 6, "UTF-8");
echo $cutStr; // 出力 "こんにちは"
?>