php截取字符串乱码问题

substr()

或smarty的truncate都有截取中文时乱码现象!

如是有人自己写了下!

function truncate($haystack,$integer,$str=’…’,$bool=true){
if(mystrlen($haystack)>$integer+1){
   return mysubstr($haystack, 0, $integer).$str;
}
else {
   return $haystack;
}

}
function mysubstr($str, $start, $len) {
$tmpstr = “”;
$strlen = $start + $len;
for($i = 0; $i < $strlen; $i++) {
if(ord(substr($str, $i, 1)) > 0xa0) {
   $tmpstr .= substr($str, $i, 2);
   $i++;
   $strlen++;
} else
   $tmpstr .= substr($str, $i, 1);
}
return $tmpstr;
}
function mystrlen($str){
$strlen = $mystrlen=strlen($str);
for($i = 0; $i < $strlen; $i++) {
   if(ord(substr($str, $i, 1)) > 0xa0) {
    $mystrlen–;
    $i++;
   }
}
return $mystrlen;
}

乱码的原因只是php在统计字符串长度时是按字节来的.截取也是按字节来的!

GBK编码汉字是二个字节,UTF-8是3个字节.英文是1 个字节.

那么我们截取字符串时保证是截取长度是6的倍数就可以了.

这样不管是用substr().还是truncate()都没有问题了!有必要搞的那么复杂么!!!!

其实mb_substr()就是用了类似的原理!