在 PHP 開發中,計算字串長度是常見需求。對於純英文字串,直接使用 strlen() 即可取得字元數;但若字串包含中文,strlen() 會回傳位元組數而非字元數,導致結果錯誤。雖然 mb_strlen() 可正確處理多位元組字元,但若伺服器未安裝 mbstring 擴充套件,就得自行實作解決方案。
若環境支援 mbstring,可直接呼叫:
$len = mb_strlen("你是我的小蘋果", "utf-8");
結果為 7,正確反映字元數量。
字串由位元組組成,英文字元佔 1 位元組(ASCII 碼 < 128,即 0x80),中文字元在 UTF-8 編碼下佔 3 位元組,在 GBK 編碼下佔 2 位元組。利用這特性,可遍歷字串位元組,遇到高位元組(≥ 0x80)即依編碼跳過對應位元組數。
<?php
function mbstrlen($str, $encoding = "utf8") {
if (($len = strlen($str)) == 0) {
return 0;
}
$encoding = strtolower($encoding);
if ($encoding == "utf8" || $encoding == "utf-8") {
$step = 3;
} elseif ($encoding == "gbk" || $encoding == "gb2312") {
$step = 2;
} else {
return false;
}
$count = 0;
for ($i = 0; $i < $len; $i++) {
$count++;
if (ord($str{$i}) >= 0x80) {
$i = $i + $step - 1; // 扣除 for 迴圈的 $i++
}
}
return $count;
}
// 測試
echo mbstrlen(iconv("utf-8", "gbk", "你是我的小蘋果"), "gbk"); // GBK 編碼測試
echo mbstrlen("你是我的小蘋果"); // UTF-8 編碼測試
此函式先判斷編碼類型設定跳躍步長,再逐位元組檢查,若為高位元組則依步長跳過,最終回傳字元計數。雖然簡易,但能在無 mbstring 環境下解決中文字元計數問題。