May 22

php中兼容utf8编码和gbk编码的substr处理函数 不指定

zpgm , 11:24 , PHP与MySql , 评论(2) , 引用(0) , 阅读(3206) , Via 本站原创 | |
    遇到要截取指定长度子字符串的问题,通常情况下一般我们可以使用php内置的substr函数来实现.但是在处理中文字符的过程中会遇到困难,因为中文字符在utf8格式编码下占3个字节,在gbk跟gb2312编码方式下占2个字节.这个时候如果我们仅仅使用substr函数的话常常会在截取最后有一个字符的时候只截取到半个字符或者1/3个字符,于是乱码就随之出现.有没有什么解决的办法呢,经过我自己的试探,有如下几中解决办法:
    1.使用php内置mb_substr函数代替substr函数,但是这需要开始mbstring功能,如果你是租用的虚拟主机的话,则有可能还是不能使用.
    2.编写自己的substr函数,代码如下

/*********************************************************/
// 函数名:cutStr
// 功能:截取指定长度的字符串,一个中文字符在广义上也作为一个字符对待
// 注:在utf8编码方式下一个中文字符占3个字节 在gb编码方式下为两个字节
/*********************************************************/
function cutStr($string, $length) {
   $strcut = '';
   $strLength = 0;
   if(strlen($string) > $length) {
       //将$length换算成实际UTF8格式编码下字符串的长度
       for($i = 0; $i < $length; $i++) {
           if ( $strLength >= strlen($string) )
               break;
           //当检测到一个中文字符时
           if( ord($string[$strLength]) > 127 )
               $strLength += 3;
           else
               $strLength += 1;
       }
       return substr($string, 0, $strLength);
   } else {
       return $string;
   }
}


此函数的优点如下:
a.不需要搜索整个字符串,而只需要处理要求长度的字符串
b.可以处理utf8跟gbk两种编码,本文处理的是utf8编码,如果是gbk编码,你只需要简单的将文中红色代码替换为"$strLength += 2;"即可

下面的的代码是国内著名的php论坛discuz的gbk版本中采用的截取指定长度字符串的函数,贴在下面以做比较.


function cutstr($string, $length) {
       $strcut = '';
       if(strlen($string) > $length) {
               for($i = 0; $i < $length - 3; $i++) {
                       $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
               }
               return $strcut.' ...';
       } else {
               return $string;
       }
}


笔记吧学习网(BIJIBA.com),版权所有!如需转载,务请保留此行文字,谢谢!!
Tags:
qq Email Homepage
2010/03/05 19:52
very goog
bucuo
2009/04/08 19:57
envy
太好了!
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]