| 函式 | 用途 | 關鍵參數 |
|---|---|---|
mb_strwidth($str, $encoding) | 取得字串視覺寬度(中文=2, 英文=1) | $encoding 指定編碼(如 UTF-8) |
mb_strimwidth($str, $start, $width, $trimmarker, $encoding) | 按視覺寬度截取,可附加尾標 | $width 目標寬度,$trimmarker 如 ... |
mb_strlen($str, $encoding) | 取得字元數(中英皆計 1) | |
mb_substr($str, $start, $length, $encoding) | 按字元數截取 |
<?php
$str = 'aaaa啊啊aaaa啊啊啊aaa'; // 4英 + 2中 + 4英 + 3中 + 3英
// 1. 取得視覺寬度:英文1、中文2
echo mb_strwidth($str, 'utf-8'); // 輸出 20 (4*1 + 2*2 + 4*1 + 3*2 + 3*1 = 20)
// 2. 寬度超過 10 才截取
if (mb_strwidth($str, 'utf-8') > 10) {
// 從 0 開始,取寬度 10,尾巴加 '...',編碼 utf-8
// 注意:尾巴 '...' 寬度 3 也計入 10 內
$str = mb_strimwidth($str, 0, 10, '...', 'utf-8');
}
echo $str; // 輸出:aaaa啊...
/*
解析:
a a a a = 4
啊 = 2 (累計 6)
... = 3 (累計 9)
下一個「啊」需 2 寬度會超過 10,故停止。
結果寬度 9,符合預期。
*/
?>
<?php
$str = 'aa12啊aa';
echo strlen($str); // 9 字節
echo mb_strlen($str, 'utf-8'); // 7 字元 (a a 1 2 啊 a a)
echo mb_substr($str, 0, 5, 'utf-8'); // aa12啊 (前 5 字元)
?>
差異:mb_strlen/substr 視中英為同等長度;mb_strwidth/imwidth 視中文佔 2 格、英文 1 格,適合「對齊顯示、固定寬度欄位」場景。
<?php
// 全域設定(建議放在 bootstrap/entry)
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
mb_http_output('UTF-8');
// 之後所有 mb_* 函式可省略 $encoding 參數
?>
拋棄 substr + strlen 手動判斷中英文位元組的寫法,mb_strimwidth / mb_strwidth 才是處理中英混排截取的標準解,簡潔、正確、效能佳。