使用 mb_strlen($str, 'UTF-8') 計算含中文字串長度時,結果與預期不符(如圖所示)。
'utf8' vs 'UTF-8'),導致預設使用內部編碼(可能為 ISO-8859-1),中文字被視為多個位元組。php.ini 中 mbstring.internal_encoding 未設為 UTF-8。// 1. 確認 mbstring 已載入
var_dump(extension_loaded('mbstring'));
// 2. 設定內部編碼(建議在入口檔案統一設定)
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
// 3. 顯式指定編碼
$len = mb_strlen($str, 'UTF-8');
// 4. 檢查字串實際位元組
var_dump(bin2hex($str)); // 觀察每字元位元組序列
// 5. 移除 BOM
if (strncmp($str, "\xEF\xBB\xBF", 3) === 0) {
$str = substr($str, 3);
}
charset=utf8mb4`、mysqli `set_charset('utf8mb4')`。mb_* 函數呼叫時顯式傳遞 'UTF-8',不依賴預設值。mb_strlen 異常 99% 為編碼不一致導致。統一 UTF-8、顯式指定編碼參數、檢查隱形字元即可解決。