由于UTF-8是一种多字节的字符编码,中文和英文字符的长度是不一致的。在进行字符串截取时,PHP默认的字符串截取函数,可能会导致截取结果错误。
先给定基本常识:
ASCII码: 一个中文汉字占两个字节的空间。
UTF-8编码: 一个中文(含繁体)等于三个字节。
Unicode编码:一个中文(含繁体)等于两个字节。
提供以下函数,使得在UTF-8环境下可以正确地截取包含中文和英文的字符串:
/**
* PHP截取utf-8中文字符串
* @param $str 被截取的字符串
* @param $start 起始长度
* @param $len 截取长度
* @param $suffix 后缀字符串
*/
function utf8_str_cut($str,$start,$len,$suffix=""){
$tmpstr = "";
$n = 0;
$i = 0;
$length = $start+$len;
while($i<strlen($str)){
$value = ord($str[$i]);
if($value >= 65 && $value <= 90){//大写字母
if($n>=$start && $n<$length){
$tmpstr .= substr($str,$i,1);
}
$n++;
$i++;
}else if($value >= 192 && $value <= 223){
if($n>=$start && $n<$length){
$tmpstr .= substr($str,$i,2);
}
$n++;
$i+=2;
}else if($value >= 224 && $value <= 239){
if($n>=$start && $n<$length){
$tmpstr .= substr($str,$i,3);
}
$n++;
$i+=3;
}else if($value >= 240 && $value <= 247){
if($n>=$start && $n<$length){
$tmpstr .= substr($str,$i,4);
}
$n++;
$i+=4;
}else{//其他情况下,包括小写字母和半角标点符号
if($n>=$start && $n<$length){
$tmpstr .= substr($str,$i,1);
}
$n += 0.5;
$i++;
}
}
if($n<$len){
return $tmpstr;
}else{
return $tmpstr.$suffix;
}
}