MB_STRCUT()はMB_Substr()とは異なります。文字ではなく、ユニットで傍受されます。 UTF-8エンコードされた文字列の場合、漢字は通常3バイトを取ります。中央のバイト位置から文字列を切り捨てると、文字が不完全である可能性があり、出力で文字化けまたは違法な文字を表示する可能性があります。
例えば:
$str = 'こんにちは,世界';
$cut = mb_strcut($str, 0, 4, 'UTF-8');
echo $cut;
このコード出力の結果は、 「あなた」という言葉がUTF-8で3バイトを占めるため、文字化けされる可能性があります。 MB_STRCUTは最初の4バイトをインターセプトし、2番目のキャラクターの「Good」の一部を切り捨て、文字化けします。
バイトレベルの制御が具体的に必要でない場合は、バイトの長さではなく文字の長さに基づいて動作するMB_SUBSTR()を使用することをお勧めします。
$str = 'こんにちは,世界';
$cut = mb_substr($str, 0, 2, 'UTF-8');
echo $cut; // 出力:こんにちは
mb_strcut()を使用する必要がある場合(たとえば、ストレージバイトの長さを制限するために)、より正確な制御のためにMB_STRLEN()と文字エンコードを組み合わせる必要があります。最初にmb_substr()を使用して文字を取得し、次にstrlen()を使用してバイト長範囲を超えるかどうかを判断できます。
function safe_mb_strcut($string, $start, $length, $encoding = 'UTF-8') {
$substr = '';
$i = 0;
$byteCount = 0;
while ($i < mb_strlen($string, $encoding)) {
$char = mb_substr($string, $i, 1, $encoding);
$charLen = strlen($char);
if ($byteCount + $charLen > $length) {
break;
}
$substr .= $char;
$byteCount += $charLen;
$i++;
}
return $substr;
}
$str = 'こんにちは,世界';
$cut = safe_mb_strcut($str, 0, 6); // バイトの総数はです6
echo $cut; // 出力:こんにちは
MB_SERIES関数を使用する場合、内部文字エンコードが予想されるもの(UTF-8など)であることを必ず設定または確認してください。次の方法を使用してグローバルに設定できます。
mb_internal_encoding('UTF-8');
さらに、次の方法でチェックしてデバッグすることもできます。
echo mb_detect_encoding($str); // 文字列エンコーディングを確認します
説明にURLを含むコンテンツの一部を傍受すると、上記の方法を使用して、URLを破壊せずに安全に傍受できます。例えば:
$str = '詳細については、ご覧ください:https://gitbox.net/docs/php-guide.html';
$cut = safe_mb_strcut($str, 0, 40);
echo $cut;
出力がURL構造を破壊したり、ソーシャルプラットフォームの概要、電子メールプレビュー、その他のシナリオに適したCarledコードを引き起こさないようにしてください。