| 函數 | "你好ABC" 結果 | 統計邏輯 | 適用場景 |
|---|---|---|---|
| strlen() | 9 | 字節數(UTF-8 中文 3 字節) | 二進制數據、原始字節長度 |
| mb_strlen($str, 'UTF-8') | 5 | 字符數(中英各算 1) | ✅ 業務邏輯長度判斷首選 |
| mb_strwidth() | 7 | 顯示寬度(中文 2,英文 1) | 終端對齊、表格列寬計算 |
深度解析
1. strlen() — 字節計數器
mbstring 擴展(現代 PHP 預裝)。mb_strlen($str, 'UTF-8'),否則用內部編碼(可能不準)。mb_strlen($username) > 20、截取 mb_substr($str, 0, 10)、分頁字符計數。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
mb_strlen($str) 使用 mb_internal_encoding(),若未設置則預設 ISO-8859-1,導致中文按字節算。substr($str, 0, mb_strlen($str)) 會截斷多字節字符產生亂碼,必須成對使用 mb_substr。VARCHAR(20) 是字符數(MySQL 4.1+),但字節存儲上限取決於 charset(utf8mb4 最多 80 字節)。統計中文長度,**永遠用 mb_strlen($str, 'UTF-8')**。牢記三者區別:strlen 數字節、mb_strlen 數字符、mb_strwidth 算顯示寬度。封裝統一服務類,杜絕項目中混用導致的隱性 Bug。