當前位置: 首頁> 最新文章列表> 如何避免mb_strcut 截取時亂碼問題

如何避免mb_strcut 截取時亂碼問題

gitbox 2025-05-27

一、為什麼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 個字節,剛好把第二個字符"好"截斷了一部分,造成了亂碼。


二、如何避免亂碼?

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; // 輸出:你好

三、設置正確的內部編碼

在使用mb_系列函數時,務必設定或確認內部字符編碼是你預期的(如UTF-8)。可使用如下方法全局設定:

 mb_internal_encoding('UTF-8');

另外,還可通過如下方式檢查和調試:

 echo mb_detect_encoding($str); // 檢查字符串編碼

四、實用場景示例:避免URL截斷亂碼

假設你要截取描述中包含URL 的部分內容,可以用我們上面的方法安全截取,不破壞URL。例如:

 $str = '更多信息請訪問:https://gitbox.net/docs/php-guide.html';
$cut = safe_mb_strcut($str, 0, 40);
echo $cut;

你可以確保輸出不會破壞URL 的結構或引起亂碼,特別適用於社交平台摘要、郵件預覽等場景。