strlen() 回傳字串的「字節數」,而非「字元數」。在 UTF-8 等多字節編碼下,中文字元佔 3 字節,導致長度計算與直覺不符。本文說明語法、陷阱、正確處理多字節字串的方法與效能考量。
strlen(string $string): int
回傳字串的字節長度(0 表示空字串)。
<?php
$str = 'Hello 世界';
echo strlen($str); // 11 (H e l l o space = 6, 世=3, 界=3)
echo mb_strlen($str); // 8 (字元數)
?>
結論:凡涉及使用者可見字元計數(截斷、驗證、排版),必須使用 mb_strlen。
mb_strlen(string $string, string|null $encoding = null): int
encoding:指定編碼(如 'UTF-8'),預設取 mb_internal_encoding()。mb_internal_encoding('UTF-8');。<?php
function mb_truncate(string $str, int $length, string $suffix = '…'): string {
if (mb_strlen($str) <= $length) return $str;
return mb_substr($str, 0, $length) . $suffix;
}
echo mb_truncate('Hello 世界', 5); // Hello…
echo mb_truncate('Hello World', 5); // Hello…
?>
| 函數 | 時間複雜度 | 相對速度 | 適用場景 |
|---|---|---|---|
| strlen | O(1) 內部儲存長度 | 最快 | 二進位資料、ASCII 純英數、記憶體檢查 |
| mb_strlen | O(n) 掃描字節判斷字元邊界 | 較慢 (約 5-10x) | 多字節字串、使用者顯示長度 |
對於極長字串(>1MB)頻繁呼叫 mb_strlen 可能成為瓶頸,建議快取長度或僅在必要時呼叫。
strlen('中文') === 6,實際字元數為 2。substr('世界', 0, 3) 會切斷字元產生亂碼,必須用 mb_substr。strlen 不適用。strlen 是底層字節計數工具,mb_strlen 才是業務層字元計數標準。現代 PHP 專案請全面採用 mbstring 擴展,並在框架啟動階段設定 mb_internal_encoding('UTF-8'),從根源杜絕長度計算錯誤。