在 PHP 中直接使用 substr() 截取包含中文的字符串,往往會導致半個漢字被截斷,產生亂碼。這是因為漢字在 GBK/UTF-8 編碼下佔用多個位元組,而 substr() 按位元組計算長度。
以下函數通過檢測字符的 ASCII 碼值(>127 視為多字節字符),逐字符拼接,確保截取長度以「字符」為單位而非位元組。
<?php
function cnSubStr($string, $sublen) {
if ($sublen >= strlen($string)) {
return $string;
}
$s = '';
for ($i = 0; $i < $sublen; $i++) {
if (ord($string{$i}) > 127) {
// 雙字節字符:取當前與下一個位元組
$s .= $string{$i} . $string{++$i};
} else {
$s .= $string{$i};
}
}
return $s;
}
?>
<?php
$str = "242432反對感是456犯得上廣泛大使館地方7890";
$len = 20;
echo cnSubStr($str, $len); // 輸出前 20 個字符(含中文)
?>
mb_substr() 或 mb_strcut()(需開啟 mbstring 擴展)。