2008-04-25
UTF-8中文截取函数
在PHP中,用substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字所占有的字节数不一样,而substr的长度参数是按照字节去算的。在GB2312编码时,一个中文占2个字节,英文为1个字节,而在UTF-8编码当中,一个中文可能占有2个或3个字节,英文或半角标点占1字节。
为解决这个问题,我找了很多资料,最终找到这么一段文字:
UTF-8编码的字符可能由1~3个字节组成, 具体数目可以由第一个字节判断出来。(理论上可能更长,但这里假设不超过3个字节)
第一个字节大于224的,它与它之后的2个字节一起组成一个UTF-8字符
第一个字节大于192小于224的,它与它之后的1个字节组成一个UTF-8字符
否则第一个字节本身就是一个英文字符(包括数字和一小部分标点符号)。
OK,知道大概的原理,解决起来就轻松多了,于是写了以下函数用于UTF-8的字符截取:
PHP代码
- //字符串截取,仅限于UTF-8
- function cut_str($str,$len) {
- if (strlen($str) <= $len) return $str;
- $n = 0;
- $tempstr = '';
- for ($i=0; $i<$len; $i++) {
- if (ord(substr($str,$n,1)) > 224) {
- $tempstr .= substr($str,$n,3);
- $n += 3;
- $i++; //把一个中文按两个英文的长度计算
- } elseif (ord(substr($str,$n,1)) > 192) {
- $tempstr .= substr($str,$n,2);
- $n += 2;
- $i++; //把一个中文按两个英文的长度计算
- } else {
- $tempstr .= substr($str,$n,1);
- $n ++;
- }
- }
- return $tempstr.'...';
- }
PHP中也有自带的函数可以用于不同编码的字符串截取,如mb_substr(),但要在php.ini中开启相应的扩展。