首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 中文串長度計算終極解決方案(GBK/UTF-8 兼容)

     編輯:MySQL 資料庫相關知識

問題背景

PHP 內置 strlen() 按字節計算長度:英文 1 字節/字符,中文則因編碼不同而異:

  • GBK/GB2312:每個中文字符 2 字節
  • UTF-8:每個中文字符 3 字節

實際場景多為中英混合,單純除以 2 或 3 不準確。

方案一:UTF-8 專用 — 正則分解法(推薦,來自 WordPress)

function utf8_strlen($string = null) {
    // 將字符串分解為單個 Unicode 字符單元
    preg_match_all("/./us", $string, $match);
    // 返回單元個數即真實字符長度
    return count($match[0]);
}

// 測試
$zhStr = '您好,中國!';
$str   = 'Hello,中國!';
echo utf8_strlen($zhStr); // 輸出:6
echo utf8_strlen($str);   // 輸出:9

原理: /./us 模式在 UTF-8 模式下匹配單個 Unicode 碼點,完美處理多字節字符。

方案二:通用按字節解析法(兼容 UTF-8 多字節規則)

function utf8_strlen($str) {
    $count = 0;
    for ($i = 0; $i < strlen($str); $i++) {
        $value = ord($str[$i]);
        if ($value > 127) { // 非 ASCII 字符
            $count++;
            // 根據 UTF-8 編碼規則跳過後續字節
            if ($value >= 192 && $value <= 223) $i++;           // 2 字節字符
            elseif ($value >= 224 && $value <= 239) $i += 2;    // 3 字節字符
            elseif ($value >= 240 && $value <= 247) $i += 3;    // 4 字節字符
            else die('Not a UTF-8 compatible string');
        }
        $count++;
    }
    return $count;
}

適用場景: 不支持 mbstring 擴展、或需理解底層編碼邏輯時。

GBK/GB2312 環境下的處理

若項目仍使用 GBK,可用 mb_strlen($str, 'GBK')(需開啟 mbstring 擴展),或類似按字節解析(中文佔 2 字節)。但強烈建議項目全面遷移至 UTF-8,一勞永逸解決編碼難題。

最佳實踐建議

  1. 數據庫、表、列、連接、HTML、PHP 文件編碼**全鏈路 UTF-8**
  2. 優先使用 mb_strlen($str, 'UTF-8')(性能最優、代碼最簡)
  3. 無 mbstring 時,使用方案一正則法
  4. 避免自寫字節解析,除非極特殊環境
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved