| 編碼 | 中文字元位元組數 | strlen() 結果 | mb_strlen() 結果 |
|---|---|---|---|
| UTF-8 | 3 | 25 | 9 |
| GB2312 | 2 | 17 | 9 |
$str = '測試文字a測試文字';
// UTF-8 檔案
echo strlen($str); // 25 (bytes)
echo mb_strlen($str,'utf-8'); // 9 (chars)
// GB2312 檔案
echo strlen($str); // 17 (bytes)
echo mb_strlen($str,'gb2312'); // 9 (chars)
MySQL 5.1+ VARCHAR(10) 存 10 個字元(非位元組),無論編碼。但若應用層用 strlen() 截取再存入,UTF-8 環境下 10 字元可能佔 30 位元組,超過欄位定義(若定義為位元組長度)導致截斷或報錯。務必用 mb_strlen()/mb_substr() 按字元計算。
function utf8_substr($str, $start, $length) {
$result = '';
$i = $count = 0;
$len = strlen($str);
while ($i < $len && $count < $start + $length) {
$byte = ord($str[$i]);
if ($byte < 128) { // ASCII
$char = $str[$i++];
} elseif ($byte < 224) { // 2-byte
$char = substr($str, $i, 2); $i += 2;
} elseif ($byte < 240) { // 3-byte
$char = substr($str, $i, 3); $i += 3;
} else { // 4-byte
$char = substr($str, $i, 4); $i += 4;
}
if ($count++ >= $start) $result .= $char;
}
return $result;
}
utf8mb4。mbstring,所有字串長度/截取/比較用 mb_* 函數並顯式指定編碼。LENGTH()(位元組),改用 CHAR_LENGTH()(字元數)。