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

PHP strlen() vs mb_strlen():中英混排字串長度計算完全指南

     編輯:PHP 綜合知識

strlen() 回傳的是位元組數,而 mb_strlen() 回傳的是字元數。在 UTF-8 編碼下,中文字佔 3 位元組,英文佔 1 位元組,兩者差異極大。

實測對照

$str = '中文a字1符';  // 4 中文 + 2 英數 = 6 字元

echo "strlen:      " . strlen($str) . "\n";           // 14 (3×4 + 1×2)
echo "mb_strlen UTF-8: " . mb_strlen($str, 'UTF-8') . "\n"; // 6
echo "mb_strlen GBK:   " . mb_strlen($str, 'GBK') . "\n";   // 8 (2×4 + 1×2)
echo "mb_strlen GB2312:" . mb_strlen($str, 'GB2312') . "\n"; // 10

計算「顯示寬度」(中文算 2、英文算 1)

$displayWidth = (strlen($str) + mb_strlen($str, 'UTF-8')) / 2;
// (14 + 6) / 2 = 10
原理:UTF-8 中文 3 bytes、英文 1 byte → bytes + chars = 3C + E + C + E = 4C + 2E,除以 2 得 2C + E 即顯示寬度。

mb_strlen 使用要點

  • 第二參數指定編碼:mb_strlen($str, 'UTF-8')
  • 省略時使用 mb_internal_encoding() 設定的內部編碼
  • 需啟用 extension=mbstring(php.ini 中取消註解)

常見應用場景

需求建議函式
截取前 N 個字元(中英同算 1)mb_substr($str, 0, $n, 'UTF-8')
截取前 N 個顯示寬度自寫函式逐字累加寬度
驗證字串長度限制(資料庫 VARCHAR 長度以位元組計)strlen($str) <= $maxBytes
驗證使用者可見長度(如暱稱 10 字)mb_strlen($str, 'UTF-8') <= 10

效能提示

  • strlen() 是 O(1)(直接讀取結構體長度),極快
  • mb_strlen() 需掃描整字串解碼,O(n),大量處理時可快取結果
  • 純 ASCII 字串兩者結果相同,可先 preg_match('/^[\x00-\x7F]*$/', $str) 判斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved