由于UTF-8是一种多字节的字符编码,中文和英文字符的长度是不一致的。在进行字符串截取时,PHP默认的字符串截取函数,可能会导致截取结果错误。
先给定基本常识:
ASCII码: 一个中文汉字占两个字节的空间。
UTF-8编码: 一个中文(含繁体)等于三个字节。
Unicode编码:一个中文(含繁体)等于两个字节。
提供以下函数,使得在UTF-8环境下可以正确地截取包含中文和英文的字符串:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | /** * 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 ; } } |