在
CodeIgniter 裡面的
Text 補助函數,目前只適用於英文字體,不支援 utf-8 或者是簡體字體,bite 數超過2的都會出問題,當然是因為這是國外的 mvc 所以也沒有考慮到這麼週到就是了,也不是沒有辦法解決,之前就用了PHP官方網站所提供的一個函式來正確切割中文字串,就是要利用
ord 判斷 ASCII 編碼範圍,或者是可以使用
mb_substr 函式正確切割,之前寫一篇可以參考看看:
[PHP] 如何切割中文標題。
底下是原本 CodeIgniter 所提供的 Text 函數
if ( ! function_exists('character_limiter'))
{
function character_limiter($str, $n = 500, $end_char = '…')
{
if (strlen($str) < $n)
{
return $str;
}
$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
if (strlen($str) <= $n)
{
return $str;
}
$out = "";
foreach (explode(' ', trim($str)) as $val)
{
$out .= $val.' ';
if (strlen($out) >= $n)
{
$out = trim($out);
return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
}
}
}
}
character_limiter 不能用在中文切割字串,只能用於英文切割,所以自己就要加上切割的函數才可以正確使用喔,利用簡單的 mb_substr 就可以做到了,這算是 CodeIgniter 的 bug 嗎?好像也不是,不過自己有找到函數來使用,那就沒差了,自己可以定義函數在 libraries/ 底下:
$len) {
$str .= "...";
break;
} elseif ((ord(substr($string,$i,1)) <= 128) && ($count < $start)) {
$count++;
} elseif ((ord(substr($string,$i,1)) > 128) && ($count < $start)) {
$count = $count+2;
$i = $i+$byte-1;
} elseif ((ord(substr($string,$i,1)) <= 128) && ($count >= $start)) {
$str .= substr($string,$i,1);
$count++;
} elseif ((ord(substr($string,$i,1)) > 128) && ($count >= $start)) {
$str .= substr($string,$i,$byte);
$count = $count+2;
$i = $i+$byte-1;
}
}
return $str;
}
}
?>
utf-8:$byte=3 | gb2312:$byte=2 | big5:$byte=2
現在都是用 utf-8,所以先把預設值 $byte 設定為 3,就可以正常使用了,使用方法是 $this->system->bite_str($string, $start, $len) 寫這樣就可以成功切割中文字串了。
Related