PHP 內置 strlen() 按字節計算長度:英文 1 字節/字符,中文則因編碼不同而異:
實際場景多為中英混合,單純除以 2 或 3 不準確。
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 碼點,完美處理多字節字符。
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,可用 mb_strlen($str, 'GBK')(需開啟 mbstring 擴展),或類似按字節解析(中文佔 2 字節)。但強烈建議項目全面遷移至 UTF-8,一勞永逸解決編碼難題。
mb_strlen($str, 'UTF-8')(性能最優、代碼最簡)