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

PHP strlen 與 mb_strlen:中文字符長度差異源於編碼

     編輯:程式設計綜合問答

現象

$str = '我心情很好';
echo strlen($str);        // 輸出 15
echo mb_strlen($str,'GBK'); // 輸出 8

單個中字符:strlen=3,mb_strlen(GBK)=2。

根本原因:編碼決定字節數

編碼中文字符字節數strlen 表現mb_strlen 指定編碼後
UTF-83 字節返回字節數 → 3mb_strlen($str,'UTF-8') → 1(字符數)
GBK/GB23122 字節返回字節數 → 2mb_strlen($str,'GBK') → 1(字符數)

代碼解析

  • 源文件保存為 **UTF-8**(<meta charset="utf-8">),故字符串在內存中為 UTF-8 編碼。
  • strlen **永遠返回字節數**,不關心編碼 → 5 個中文字符 × 3 字節 = 15。
  • mb_strlen($str,'GBK') 將 UTF-8 字節流**按 GBK 解碼**,因為 UTF-8 的中文字節在 GBK 中多為非法或雙字節組合,導致計算出 8(非預期字符數)。
  • 正確用法:mb_strlen($str,'UTF-8') → 返回 5(真實字符數)。

最佳實踐

  1. 統一項目編碼為 UTF-8:文件保存、數據庫連接、HTML meta、PHP mb_internal_encoding('UTF-8')。
  2. 字符長度用 mb_strlen($str, 'UTF-8'),或設置 mb_internal_encoding('UTF-8') 後直接 mb_strlen($str)。
  3. 字節長度用 strlen($str)(如計算網絡傳輸大小)。
  4. 切勿混用編碼參數:mb_strlen($utf8_str, 'GBK') 結果無意義。

總結

strlen 算字節,**UTF-8 中文佔 3 字節,GBK 佔 2 字節**。mb_strlen 指定正確編碼後算字符數。**項目全鏈路統一 UTF-8,長度計算用 mb_strlen('UTF-8')**,即可避免所有編碼長度困惑。

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