| 函式 | 計算單位 | UTF-8 中文 | 適用場景 |
|---|---|---|---|
strlen() | 位元組 | 3 位元組/字 | 二進位資料、純 ASCII |
mb_strlen() | 字元 | 1 字元/字 | 多語言文字、顯示長度計算 |
$str = '中文a字1符'; // 4 中文 + 2 英數
echo strlen($str); // 14 (4×3 + 2)
echo '<br />';
echo mb_strlen($str, 'UTF-8'); // 6
中文字佔 2 格,英數佔 1 格,公式:
$visual_width = (strlen($str) + mb_strlen($str, 'UTF-8')) / 2;
// 範例:(14 + 6) / 2 = 10
strlen = 3C + Emb_strlen = C + Efunction get_visual_width($str, $encoding = 'UTF-8') {
return (strlen($str) + mb_strlen($str, $encoding)) / 2;
}
function mb_strimwidth_visual($str, $width, $trimmarker = '...', $encoding = 'UTF-8') {
$current = 0;
$len = mb_strlen($str, $encoding);
for ($i = 0; $i < $len; $i++) {
$char = mb_substr($str, $i, 1, $encoding);
$current += (strlen($char) > 1) ? 2 : 1;
if ($current > $width) {
return mb_substr($str, 0, $i, $encoding) . $trimmarker;
}
}
return $str;
}
mbstring 擴展非核心內建,需在 php.ini 啟用:
extension=mbstring
並建議設定內部編碼:
mb_internal_encoding('UTF-8');
掌握 strlen(位元組)與 mb_strlen(字元)的本質差異,並善用視覺寬度公式,即可精準處理中英混排的截斷、對齊、排版等需求。