mb_strcut()與mb_substr()不同,它是以為單位進行截取,而非字符。對於UTF-8 編碼的字符串,一個中文字符通常佔用3 個字節,如果你將字符串從中間某個字節位置截斷,可能會導致字符不完整,從而在輸出時顯示亂碼或非法字符。
例如:
$str = '你好,世界';
$cut = mb_strcut($str, 0, 4, 'UTF-8');
echo $cut;
這段代碼輸出的結果很可能是亂碼,因為"你"這個字在UTF-8 中佔用3 個字節, mb_strcut截取了前4 個字節,剛好把第二個字符"好"截斷了一部分,造成了亂碼。
如果你不特別需要字節級控制,推薦使用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_系列函數時,務必設定或確認內部字符編碼是你預期的(如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 的結構或引起亂碼,特別適用於社交平台摘要、郵件預覽等場景。