| 編碼 | 字串 | strlen (位元組) | mb_strlen (字元) |
|---|---|---|---|
| UTF-8 | 測試文字a測試文字 | 25 | 9 |
| GB2312 | 測試文字a測試文字 | 17 | 9 |
UTF-8 中文字佔 3 位元組,GB2312 佔 2 位元組,英文數字均佔 1 位元組。strlen 永遠回傳位元組數,mb_strlen 配合編碼參數回傳字元數。
MySQL 5.1+ 的 VARCHAR(10) 限制為 10 個字元而非位元組,無論編碼。因此判斷長度時必須依編碼選擇正確函式。
function cutStr($str, $start, $length) {
$restr = ''; $j = 0;
$end = $start + $length - 1;
$plen = strlen($str);
for ($i=0; $i<$plen; $i++) {
$restr .= (ord($str[$i]) > 127) ? $str[$i].$str[++$i].$str[++$i] : $str[$i];
$j++;
if ($j < $start) $restr = '';
if ($j >= $end) break;
}
return $restr;
}
原理:UTF-8 中文字首位元組 > 127,直接取三個位元組組成一字元。