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

PHP 統計中文字符長度正確姿勢:mb_strlen vs strlen vs mb_strwidth

     編輯:PHP 綜合知識

核心結論先行

函數"你好ABC" 結果統計邏輯適用場景
strlen()9字節數(UTF-8 中文 3 字節)二進制數據、原始字節長度
mb_strlen($str, 'UTF-8')5字符數(中英各算 1)✅ 業務邏輯長度判斷首選
mb_strwidth()7顯示寬度(中文 2,英文 1)終端對齊、表格列寬計算

代碼驗證



深度解析

1. strlen() — 字節計數器

  • 不關心編碼,純粹返回內存佔用字節數。
  • UTF-8 下:ASCII 1 字節,漢字 3 字節(擴展區 4 字節)。
  • ❌ 不可用於 表單驗證長度、截取字符串、分頁計算。

2. mb_strlen() — 字符計數器(推薦)

  • 需啟用 mbstring 擴展(現代 PHP 預裝)。
  • 第二參數必須顯式指定編碼:mb_strlen($str, 'UTF-8'),否則用內部編碼(可能不準)。
  • ✅ 表單驗證 mb_strlen($username) > 20、截取 mb_substr($str, 0, 10)、分頁字符計數。

3. mb_strwidth() — 顯示寬度計算器

  • 東亞字符(中日韓)寬度 2,ASCII 寬度 1,模擬等寬字體終端顯示。
  • 適用:CLI 表格對齊、固定寬度輸出、終端進度條。

實戰封裝:統一字符串長度服務

class StrLen {
    public static function len(string $str, string $encoding = 'UTF-8'): int {
        return mb_strlen($str, $encoding);
    }

    public static function width(string $str, string $encoding = 'UTF-8'): int {
        return mb_strwidth($str, $encoding);
    }

    public static function bytes(string $str): int {
        return strlen($str);
    }

    // 截取:按字符數
    public static function sub(string $str, int $start, int $length = null, string $encoding = 'UTF-8'): string {
        return mb_substr($str, $start, $length ?? mb_strlen($str, $encoding), $encoding);
    }

    // 截取:按顯示寬度(適合終端)
    public static function subWidth(string $str, int $maxWidth, string $encoding = 'UTF-8'): string {
        $width = 0;
        $result = '';
        $len = mb_strlen($str, $encoding);
        for ($i = 0; $i < $len; $i++) {
            $char = mb_substr($str, $i, 1, $encoding);
            $charWidth = mb_strwidth($char, $encoding);
            if ($width + $charWidth > $maxWidth) break;
            $result .= $char;
            $width += $charWidth;
        }
        return $result;
    }
}

// 使用
echo StrLen::len("你好ABC");      // 5
echo StrLen::width("你好ABC");    // 7
echo StrLen::sub("你好ABC", 0, 3); // 你好A

常見坑位

  1. 忘記指定編碼:mb_strlen($str) 使用 mb_internal_encoding(),若未設置則預設 ISO-8859-1,導致中文按字節算。
  2. 混用 strlen/mb_strlen 截取:substr($str, 0, mb_strlen($str)) 會截斷多字節字符產生亂碼,必須成對使用 mb_substr。
  3. 資料庫字段長度:VARCHAR(20) 是字符數(MySQL 4.1+),但字節存儲上限取決於 charset(utf8mb4 最多 80 字節)。

結語

統計中文長度,**永遠用 mb_strlen($str, 'UTF-8')**。牢記三者區別:strlen 數字節、mb_strlen 數字符、mb_strwidth 算顯示寬度。封裝統一服務類,杜絕項目中混用導致的隱性 Bug。

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