GBK 中文佔 2 位元組,UTF-8 中文佔 3 位元組,英文皆佔 1 位元組。直接用 substr() 會導致中文截斷產生亂碼。以下函數完美解決中英混合截取。
function get_word($string, $length, $dot = '..', $charset = 'gbk') {
if (strlen($string) <= $length) return $string;
$string = str_replace(array(' ', ' ', '&', '"', '<', '>'), array('', '', '&', '"', '<', '>'), $string);
$strcut = '';
if (strtolower($charset) == 'utf-8') {
$n = $tn = $noc = 0;
while ($n < strlen($string)) {
$t = ord($string[$n]);
if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { $tn = 1; $n++; $noc++; }
elseif (194 <= $t && $t <= 223) { $tn = 2; $n += 2; $noc += 2; }
elseif (224 <= $t && $t < 239) { $tn = 3; $n += 3; $noc += 2; }
elseif (240 <= $t && $t <= 247) { $tn = 4; $n += 4; $noc += 2; }
elseif (248 <= $t && $t <= 251) { $tn = 5; $n += 5; $noc += 2; }
elseif ($t == 252 || $t == 253) { $tn = 6; $n += 6; $noc += 2; }
else { $n++; }
if ($noc >= $length) break;
}
if ($noc > $length) $n -= $tn;
$strcut = substr($string, 0, $n);
} else {
for ($i = 0; $i < $length; $i++) {
$strcut .= ord($string[$i]) > 127 ? $string[$i] . $string[++$i] : $string[$i];
}
}
return $strcut . $dot;
}
$str = "歡迎 visit 簡明 bkjia"; $str_result = get_word($str, 12); echo $str_result; // 輸出: 歡迎 visit..