下载JBLOG 1.5.2 基于PHP+MySQL的博客程序

UTF-8中文截取函数

分类:技术学习  |  时间:2008-04-25 13:07  |  阅读:879人/次  |  标签:PHPJBLOG

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代码
  1. //字符串截取,仅限于UTF-8   
  2. function cut_str($str,$len) {   
  3.     if (strlen($str) <= $lenreturn $str;   
  4.     $n = 0;   
  5.     $tempstr = '';   
  6.     for ($i=0; $i<$len$i++) {   
  7.         if (ord(substr($str,$n,1)) > 224) {   
  8.             $tempstr .= substr($str,$n,3);   
  9.             $n += 3;   
  10.             $i++; //把一个中文按两个英文的长度计算   
  11.         } elseif (ord(substr($str,$n,1)) > 192) {   
  12.             $tempstr .= substr($str,$n,2);   
  13.             $n += 2;   
  14.             $i++; //把一个中文按两个英文的长度计算   
  15.         } else {   
  16.             $tempstr .= substr($str,$n,1);   
  17.             $n ++;   
  18.         }   
  19.     }      
  20.     return $tempstr.'...';   
  21. }   


PHP中也有自带的函数可以用于不同编码的字符串截取,如mb_substr(),但要在php.ini中开启相应的扩展。

本站提供网站建设/程序开发/模板定制服务,价格从优,在线交谈点击这里给我发消息

3条评论 关于 “UTF-8中文截取函数”

  1. avatar
    沙发
    [回复] Lin.x 发表于: May 17th, 2008 at 18:57 pm

    这个问题我也研究过,自己写了个函数,和上文差不多 http://www.lineks.cn/article/28/

  2. avatar
    板凳
    [回复] safd 发表于: December 26th, 2008 at 15:45 pm

    上面的代码有错误啊

  3. avatar
    地板
    [回复] 今心 发表于: January 23rd, 2009 at 0:21 am

    php5起有iconv_substr()
    不用开启扩展,


发表您的评论

 

点击换一张验证码