現在の位置: ホーム> 最新記事一覧> MB_STRCUTの傍受中に文字化けしたコードの問題を回避する方法

MB_STRCUTの傍受中に文字化けしたコードの問題を回避する方法

gitbox 2025-05-27

1.なぜMB_STRCUTが文字化けするのですか?

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」の一部を切り捨て、文字化けします。


2。文字化けのコードを避ける方法は?

1。MB_SUBSTRを使用して置き換えます

バイトレベルの制御が具体的に必要でない場合は、バイトの長さではなく文字の長さに基づいて動作するMB_SUBSTR()を使用することをお勧めします。

 $str = 'こんにちは,世界';
$cut = mb_substr($str, 0, 2, 'UTF-8');
echo $cut; // 出力:こんにちは

2。文字の境界を判断し、それらを傍受します

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; // 出力:こんにちは

3.正しい内部エンコーディングを設定します

MB_SERIES関数を使用する場合、内部文字エンコードが予想されるもの(UTF-8など)であることを必ず設定または確認してください。次の方法を使用してグローバルに設定できます。

 mb_internal_encoding('UTF-8');

さらに、次の方法でチェックしてデバッグすることもできます。

 echo mb_detect_encoding($str); // 文字列エンコーディングを確認します

4。実用的なシナリオの例:URLの切り捨てや文字化けコードを避けてください

説明にURLを含むコンテンツの一部を傍受すると、上記の方法を使用して、URLを破壊せずに安全に傍受できます。例えば:

 $str = '詳細については、ご覧ください:https://gitbox.net/docs/php-guide.html';
$cut = safe_mb_strcut($str, 0, 40);
echo $cut;

出力がURL構造を破壊したり、ソーシャルプラットフォームの概要、電子メールプレビュー、その他のシナリオに適したCarledコードを引き起こさないようにしてください。