$str = '我心情很好';
echo strlen($str); // 輸出 15
echo mb_strlen($str,'GBK'); // 輸出 8
單個中字符:strlen=3,mb_strlen(GBK)=2。
| 編碼 | 中文字符字節數 | strlen 表現 | mb_strlen 指定編碼後 |
|---|---|---|---|
| UTF-8 | 3 字節 | 返回字節數 → 3 | mb_strlen($str,'UTF-8') → 1(字符數) |
| GBK/GB2312 | 2 字節 | 返回字節數 → 2 | mb_strlen($str,'GBK') → 1(字符數) |
<meta charset="utf-8">),故字符串在內存中為 UTF-8 編碼。strlen **永遠返回字節數**,不關心編碼 → 5 個中文字符 × 3 字節 = 15。mb_strlen($str,'GBK') 將 UTF-8 字節流**按 GBK 解碼**,因為 UTF-8 的中文字節在 GBK 中多為非法或雙字節組合,導致計算出 8(非預期字符數)。mb_strlen($str,'UTF-8') → 返回 5(真實字符數)。mb_internal_encoding('UTF-8')。mb_strlen($str, 'UTF-8'),或設置 mb_internal_encoding('UTF-8') 後直接 mb_strlen($str)。strlen($str)(如計算網絡傳輸大小)。mb_strlen($utf8_str, 'GBK') 結果無意義。strlen 算字節,**UTF-8 中文佔 3 字節,GBK 佔 2 字節**。mb_strlen 指定正確編碼後算字符數。**項目全鏈路統一 UTF-8,長度計算用 mb_strlen('UTF-8')**,即可避免所有編碼長度困惑。