由于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; } }