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

PHP 正確統計字符串長度:iconv_strlen() 與 mb_strlen() 解決中英文混合計數問題

     編輯:PHP 相關知識

PHP 字符串長度統計:為什麼 strlen() 不能用於中文

strlen() 返回字節數,UTF-8 下一個漢字佔 3 字節,導致長度統計失真。正確方案是使用 mb_strlen() 或 iconv_strlen() 按字符數統計。

對比示例

<?php
$str = "Hello世界"; // 5 ASCII + 2 中文 = 7 字符,5 + 6 = 11 字節

echo "strlen: "    . strlen($str) . "\n";      // 11 (字節數)
echo "mb_strlen: " . mb_strlen($str, 'UTF-8') . "\n"; // 7 (字符數)
echo "iconv_strlen: " . iconv_strlen($str, 'UTF-8') . "\n"; // 7 (字符數)
?>

函數對比

函數擴展依賴編碼參數速度備註
strlen核心無極快僅統計字節
mb_strlenmbstring可選 (第 2 參數)快推薦,支援列表編碼,可設內部編碼
iconv_strleniconv必填 (第 2 參數)中等較舊項目常用,需顯式指定編碼
grapheme_strlenintl (ICU)可選較慢按字素簇統計,正確處理 Emoji 組合字符 (如 👨‍👩‍👧‍👦 算 1 個)

最佳實踐

<?php
// 1. 統一設置內部編碼 (項目啟動時)
mb_internal_encoding('UTF-8');

// 2. 直接使用 mb_strlen (無需每次傳編碼)
$len = mb_strlen($str);

// 3. 表單驗證示例:用戶名 2-20 字符
if (mb_strlen($username) < 2 || mb_strlen($username) > 20) {
    throw new Exception('用戶名長度需 2-20 字符');
}

// 4. 截取前 N 字符 (配合 mb_substr)
$summary = mb_substr($content, 0, 100) . '...';
?>

避坑提醒

  • 不要用 strlen 驗證中文長度:會誤判「超長」或「太短」。
  • 資料庫字段長度:MySQL VARCHAR(20) 存儲字符數 (utf8mb4),PHP 驗證必須用 mb_strlen 對齊。
  • Emoji 計數:mb_strlen("👨‍👩‍👧‍👦") === 7 (碼位數),grapheme_strlen() === 1 (視覺字符)。展示層建議用 grapheme_strlen。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved