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

PHP mb_strlen() 計算中文字長度異常排查

     編輯:程式設計綜合問答

現象描述

使用 mb_strlen($str, 'UTF-8') 計算含中文字串長度時,結果與預期不符(如圖所示)。

常見原因

  1. 編碼參數錯誤或缺失:未指定第二參數或指定錯誤編碼(如 'utf8' vs 'UTF-8'),導致預設使用內部編碼(可能為 ISO-8859-1),中文字被視為多個位元組。
  2. 字串實際編碼非 UTF-8:資料來源(資料庫、檔案、外部 API)實際為 GBK/Big5,但程式假設為 UTF-8。
  3. mbstring 擴展未啟用或內部編碼未設定:php.ini 中 mbstring.internal_encoding 未設為 UTF-8。
  4. 隱形字元:字串含 BOM、零寬空格、控制字元等不可見字元。

排查步驟

// 1. 確認 mbstring 已載入
var_dump(extension_loaded('mbstring'));

// 2. 設定內部編碼(建議在入口檔案統一設定)
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');

// 3. 顯式指定編碼
$len = mb_strlen($str, 'UTF-8');

// 4. 檢查字串實際位元組
var_dump(bin2hex($str)); // 觀察每字元位元組序列

// 5. 移除 BOM
if (strncmp($str, "\xEF\xBB\xBF", 3) === 0) {
    $str = substr($str, 3);
}

最佳實踐

  • 專案統一使用 UTF-8(檔案編碼、資料庫連線、HTML meta、PHP 內部編碼)。
  • 資料庫連線指定字符集:PDO `charset=utf8mb4`、mysqli `set_charset('utf8mb4')`。
  • 所有 mb_* 函數呼叫時顯式傳遞 'UTF-8',不依賴預設值。

結論

mb_strlen 異常 99% 為編碼不一致導致。統一 UTF-8、顯式指定編碼參數、檢查隱形字元即可解決。

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