29Mar

PHP截取中文字符串乱码问题(UTF8编码下)(转)

时间: 2012-3-29 分类: PHP开发 作者:

TAGS:,

前一段时间,在为php截取中文字符串乱码的问题头疼。网上的方法大多杂而乱,没办法,自己新学的,又没有基础。过几天再搜索一下的时候,发现了这篇新的文章,完美解决这个问题,于是转载共享。

前几天,去面试中遇到一个帮毕业就遇到的问题,PHP截取中文字符串乱码问题。究其根本php的字符串截取函数是根据字节来的,而汉字的编码一需要的不单单一个字节,那么自然就会出现乱码问题。

现在常用的编码格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升级。现在我开发中遇到的基本都是UTF8,GBK常用在论 坛BBS上。今天自己写了下UTF8的,测试下还说的过去,毕竟从网上拷下来的是可以用,但是如果有时间最好还是自己写一下,这样只有到自己手里的才是自 己的。

今天写了UTF8的中文字符截取,不单单是截取从零开始,可以指定位置开始,当然如果是中文那么会中文下一个字符开始,结束是从指定的位置或者指定的汉字结束位置。

函数代码:

  1. function subUTF8str($str,$start=0,$length=80){
  2.     $str_length = strlen($str);//传入字符串的字节长度
  3.     $end_length = $start + $length; //8 //预计结束字节
  4.     $cut_length = 0; //截取的字节长度
  5.     $cut_end = $cut_begin = false; //初始化截取状态
  6.     if($start >= $str_length){ //如果字符串开始位置大于字符串总长度 那么返回空
  7.         return null;
  8.     }
  9.     if( ($start == 0) && ($length >= $str_length) ){ //如果起始位置是0 截取长度大于等于总长度 直接返回
  10.         return $str;
  11.     }
  12.     for($i=0; $i <= $str_length; $i++){
  13.         if( ($start <= $i) && ($cut_begin === false) ){//如果这一个判断在第二个if后面则取下一个汉字为开头
  14.             $cut_begin = $i;
  15.         }
  16.         if (ord($str[$i]) > 127){ //如果当前字符的ASCII 值大于127 则是认为是汉字
  17.             $i += 2; //UTF-8汉字是24位三个字节 如果是汉字那么增加两位
  18.             $cut_begin?$cut_length += 3:null;
  19.         }else{
  20.             $cut_begin?$cut_length += 1:null;
  21.         }
  22.         if( ($end_length <= $i) && ($cut_end === false) ){
  23.             break;
  24.         }
  25.     }
  26.     return substr($str, $cut_begin , $cut_length );
  27. }

 

整体测试代码

  1. header(“Content-type:text/html;charset=UTF-8”);
  2. set_time_limit(0);
  3. $str = ”;
  4. for($i=0;$i<1000;$i++){
  5.     $str .=’这里是截cefaACC截$%^&*截()_((截^&*^截*&%截%’;
  6. }
  7. function subUTF8str($str,$start=0,$length=80){
  8.     $str_length = strlen($str);//传入字符串的字节长度
  9.     $end_length = $start + $length; //8 //预计结束字节
  10.     $cut_length = 0; //截取的字节长度
  11.     $cut_end = $cut_begin = false; //初始化截取状态
  12.     if($start >= $str_length){ //如果字符串开始位置大于字符串总长度 那么返回空
  13.         return null;
  14.     }
  15.     if( ($start == 0) && ($length >= $str_length) ){ //如果起始位置是0 截取长度大于等于总长度 直接返回
  16.         return $str;
  17.     }
  18.     for($i=0; $i <= $str_length; $i++){
  19.         if( ($start <= $i) && ($cut_begin === false) ){//如果这一个判断在第二个if后面则取下一个汉字为开头
  20.             $cut_begin = $i;
  21.         }
  22.         if (ord($str[$i]) > 127){ //如果当前字符的ASCII 值大于127 则是认为是汉字
  23.             $i += 2; //UTF-8汉字是24位三个字节 如果是汉字那么增加两位
  24.             $cut_begin?$cut_length += 3:null;
  25.         }else{
  26.             $cut_begin?$cut_length += 1:null;
  27.         }
  28.         if( ($end_length <= $i) && ($cut_end === false) ){
  29.             break;
  30.         }
  31.     }
  32.     return substr($str, $cut_begin , $cut_length );
  33. }
  34. echo time().'<br/>’;
  35. for($i=0;$i<1000;$i++){
  36.     $begin = rand(1,100);
  37.     $length = rand(1,1000);
  38.     echo subUTF8str($str,$begin,$length).”\n”;
  39. }
  40. echo time().'<br/>’;

下次有机会写其他编码格式的

本文出自 “web开发之php” 博客,请务必保留此出处http://phpzf.blog.51cto.com/3011675/794660

 

大家可以看看我做的效果图:

网址是:www.sttwin.com

喜欢我们的文章请您与朋友分享:

除非特殊注明,本文版权归原作者所有,欢迎转载!转载请注明版权以及本文地址,谢谢。
转载保留版权:泰山个人博客 >> PHP截取中文字符串乱码问题(UTF8编码下)(转)
本文地址:http://www.tais3.com/2012/69.html + 复制链接

相关文章:

Comments

目前有 0 条精彩评论

  1. 还没有任何评论,你来说两句吧

Comments
发表评论

电子邮件地址不会被公开。 * 标记为必填选项

  • 正确格式为: http://www.tais3.com