首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP strlen 函數詳解:字串長度計算、多字節陷阱與 mb_strlen 替代方案

     編輯:PHP 相關知識

前言

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 完整用法

mb_strlen(string $string, string|null $encoding = null): int
  • encoding:指定編碼(如 'UTF-8'),預設取 mb_internal_encoding()。
  • 專案啟動時設定:mb_internal_encoding('UTF-8');。

實戰範例: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…
?>

效能對比

函數時間複雜度相對速度適用場景
strlenO(1) 內部儲存長度最快二進位資料、ASCII 純英數、記憶體檢查
mb_strlenO(n) 掃描字節判斷字元邊界較慢 (約 5-10x)多字節字串、使用者顯示長度

對於極長字串(>1MB)頻繁呼叫 mb_strlen 可能成為瓶頸,建議快取長度或僅在必要時呼叫。

常見誤區

  1. 用 strlen 驗證中文輸入長度:strlen('中文') === 6,實際字元數為 2。
  2. substr 截取中文:substr('世界', 0, 3) 會切斷字元產生亂碼,必須用 mb_substr。
  3. json_encode 長度限制:JSON 規範以字元為單位,strlen 不適用。

結語

strlen 是底層字節計數工具,mb_strlen 才是業務層字元計數標準。現代 PHP 專案請全面採用 mbstring 擴展,並在框架啟動階段設定 mb_internal_encoding('UTF-8'),從根源杜絕長度計算錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved