Home  >  Article  >  Backend Development  >  PHP兑现中文字符的无乱码截断

PHP兑现中文字符的无乱码截断

WBOY
WBOYOriginal
2016-06-13 13:11:11869browse

PHP实现中文字符的无乱码截断

PHP内置的substr()函数不能对中文字符进行很好的截断处理,对于一些中英文混合的字符会出现乱码的情况。下面提供两种解决函数。

?

1、GB2312编码方式的截断

?

function msubstr($str, $start, $len) { 

   if (strlen($str)-$start  0xa0) {   //0xa0 表示中文汉字编码的第一个编码字符ASCII 码值都大于0xa0

            $tmpstr .= substr($str, $i, 2);

            $i++;

         } else

            $tmpstr .= substr($str, $i, 1);

     }

     return $tmpstr . "...";

} 

?

2、utf8格式下的中文字符截断

?

UTF-8编码的字符可能由1~3个字节组成, 具体数目可以由第一个字节判断出来。(理论上可能更长,但这里假设不超过3个字节)

第一个字节大于224的,它与它之后的2个字节一起组成一个UTF-8字符

第一个字节大于192小于224的,它与它之后的1个字节组成一个UTF-8字符

否则第一个字节本身就是一个英文字符(包括数字和一小部分标点符号)。

?

//$sourcestr 是要处理的字符串

//$cutlength 为截取的长度(即字数)

function cut_str($sourcestr,$cutlength)

{

   $returnstr='';

   $i=0;

   $n=0;

   $str_length=strlen($sourcestr);//字符串的字节数

   while (($n=224)    //如果ASCII位高与224,

      {

         $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符         

         $i=$i+3;            //实际Byte计为3

         $n++;            //字串长度计1

      }

       elseif ($ascnum>=192) //如果ASCII位高与192,

      {

         $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符

         $i=$i+2;            //实际Byte计为2

         $n++;            //字串长度计1

      }

       elseif ($ascnum>=65 && $ascnum$cutlength){

          $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号

      }

     return $returnstr;

}
?

?

?

?

1 楼 zeroneta 2011-09-26  
呵呵 那我就在来个 UTF-8截取无乱码
function utf8( $a, $s = '' )
{
preg_match_all( '/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/', $a, $d, PREG_PATTERN_ORDER );
return join( $s, $d[0] );
}

2 楼 zeroneta 2011-09-26  
调用方式


utf8( substr( '截取我', 0, 1 ) );

3 楼 bupt_roy 2011-09-29  
zeroneta 写道
调用方式


utf8( substr( '截取我', 0, 1 ) );

高手,学习学习,哈哈
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn