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

PHP 字符串長度函數對比:strlen 與 mb_strlen 核心差異與實戰應用

     編輯:PHP 相關知識

PHP 字符串長度函數對比:strlen 與 mb_strlen 核心差異與實戰應用

PHP 提供 strlen() 與 mb_strlen() 兩個計算字符串長度的函數。在純英文環境下二者無差異,但一旦引入中文等多字節字符,字節計數與字符計數的本質區別將導致截取、驗證、顯示等環節出現難以排查的 Bug。本文通過原理剖析、多編碼實測、視覺寬度推導模型、擴展配置指南,建立完整認知框架。

一、本質區別:字節 vs 字符

<?php
// 文件編碼:UTF-8
$str = '中文a字1符'; // 4中文 + 2ASCII

echo "strlen: " . strlen($str) . PHP_EOL;              // 14 字節
echo "mb_strlen UTF-8: " . mb_strlen($str, 'UTF-8') . PHP_EOL; // 6 字符
echo "mb_strlen GBK: " . mb_strlen($str, 'GBK') . PHP_EOL;     // 8(編碼不匹配產生亂碼計數)
echo "mb_strlen GB2312: " . mb_strlen($str, 'GB2312') . PHP_EOL; // 10
?>
函數計數單位中文處理 (UTF-8)編碼參數性能
strlen字節3 字節/字無O(1) 極快
mb_strlen字符1 長度/字必需(建議顯式 'UTF-8')O(n) 遍歷解碼

二、視覺寬度計算模型(核心實戰技巧)

等寬字體下:中文佔 2 列,ASCII 佔 1 列。利用 strlen(字節數)與 mb_strlen(字符數)的線性關係:

<?php
function visualWidth($str, $charset = 'UTF-8') {
    return (int)((strlen($str) + mb_strlen($str, $charset)) / 2);
}

// 驗證
$cases = ['中文a字1符'=>10, 'Hello世界'=>7, '123'=>3, '測試'=>4];
foreach ($cases as $s => $exp) {
    echo "$s => " . visualWidth($s) . " (預期 $exp)" . PHP_EOL;
}
?>

數學證明:UTF-8 中文 3 字節 + 1 字符 = 4 → /2 = 2 寬度;ASCII 1 字節 + 1 字符 = 2 → /2 = 1 寬度。完美匹配視覺模型。

三、mbstring 擴展必備配置

  1. extension=mbstring (php.ini 取消註釋)
  2. 入口文件:mb_internal_encoding('UTF-8') 統一內部編碼
  3. 禁用函數重載:mbstring.func_overload = 0(防止覆蓋 strlen/substr 等核心函數)
  4. 檢查:php -m | grep mbstring 確認加載

四、常見誤區與避坑

  • ❌ mb_strlen($str) 不傳編碼 → 依賴不可控的內部編碼
  • ❌ 用 strlen 判斷中文字符數 → 實際獲取字節數
  • ❌ 用 count($str) 計算長度 → PHP 7.2+ 報警告,返回 1
  • ✅ 截取字符串配套用 mb_substr($str, 0, $n, 'UTF-8')
  • ✅ 存儲長度驗證:VARCHAR(200) 實際可存 ~66 中文(200/3)

五、count() 完全不同

count() 專用於數組元素計數或Countable 對象,與字符串長度無任何關係。

掌握「字節≠字符、編碼必須顯式、視覺寬度可推導」三大核心認知,配合 mbstring 正確配置,即可徹底解決 PHP 多語言環境下的字符串長度計算難題。

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