静坐常思己过,闲谈莫论人非,能受苦乃为志士,肯吃亏不是痴人,敬君子方显有德,怕小人不算无能,退一步天高地阔,让三分心平气和,欲进步需思退步,若着手先虑放手,如得意不宜重往,凡做事应有余步。持黄金为珍贵,知安乐方值千金,事临头三思为妙,怒上心忍让最高。切勿贪意外之财,知足者人心常乐。若能以此去处事,一生安乐任逍遥。

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

作者:大鹏 发布于:2007-5-22 11:24 Tuesday 分类:PHP&MySql

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

[code]/*********************************************************/
// 函数名: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;
   }
}[/code]

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

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


[code]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;
       }
} [/code]

笔记吧学习网(BIJIBA.com),版权所有!如需转载,务请保留此行文字,谢谢!!


标签: php

et_highlighter