PHP 字符串長度計算陷阱:strlen 返回字節數,mb_strlen 返回字符數,中英文混排時差異巨大,必須根據編碼選擇正確函數。
$str = '中文a字1符'; // UTF-8 編碼文件 echo strlen($str); // 14 (字節數: 4漢字×3 + 2 ASCII) echo mb_strlen($str, 'utf8'); // 6 (字符數: 4漢字 + 2 ASCII) echo mb_strlen($str, 'gbk'); // 8 (GBK: 4漢字×2 + 2 ASCII) echo mb_strlen($str, 'gb2312'); // 10
| 編碼 | 中文字節數 | 英文字節數 |
|---|---|---|
| UTF-8 | 3 | 1 |
| GBK/GB2312 | 2 | 1 |
中文佔 2 位,英文佔 1 位:
$display_width = (strlen($str) + mb_strlen($str, 'UTF8')) / 2; // "中文a字1符" → (14 + 6) / 2 = 10 位
mb_strlen($str, 'UTF-8')mb_internal_encoding())extension=php_mbstring.dll| 場景 | 錯誤做法 | 正確做法 |
|---|---|---|
| 截取前 N 個字符 | substr($str, 0, $n) | mb_substr($str, 0, $n, 'UTF-8') |
| 驗證長度限制 | strlen($str) > 20 | mb_strlen($str, 'UTF-8') > 20 |
| 按字符遍歷 | for($i=0;$i| for($i=0;$i | |
mb_* 系列函數mbstring.internal_encoding = UTF-8 避免重複傳參