+ -
当前位置:首页 → 问答吧 → 解决PHP截取中文字符串问题

解决PHP截取中文字符串问题

时间:2011-04-06

来源:互联网

解决PHP截取中文字符串问题




PHP截取字符串如果是英文那很好办,直接用substr就行了,一般不会出现乱码.中文就有点麻烦了.
下面给出两种解决办法:
(一)直接使用Multi-Byte函数库的mb_substr();函数就行了,实例代码如下
  1. <?php  
  2. echo mb_substr($str, $start, $length, $encoding);
  3. echo "<br />";
  4. ?>
复制代码
这种方法简单,快速,安全,漂亮,诱惑...反正什么好词都可以形容它,但是,可惜我的GoDaddy主机不支持,所以得另寻出路
(二)自定义截取中文字符串函数,基本上就是仿照mb_substr写个函数,直接调用罢了,以下为我找到的代码,其实很简单
  1. <?php  
  2. function  substr_cn($string_input,$start,$length)
  3. {
  4.     /* 功能:
  5.      * 此算法用于截取中文字符串
  6.      * 函数以单个完整字符为单位进行截取,即一个英文字符和一个中文字符均表示一个单位长度
  7.      * 参数:
  8.      * 参数$string为要截取的字符串,
  9.      * 参数$start为欲截取的起始位置,
  10.      * 参数$length为要截取的字符个数(一个汉字或英文字符都算一个)
  11.      * 返回值:
  12.      * 返回截取结果字符串
  13.      * */
  14.     $str_input=$string_input;
  15.     $len=$length;
  16.     $return_str="";
  17.     //定义空字符串
  18.     for ($i=0;$i<2*$len+2;$i++)
  19.         $return_str=$return_str." ";
  20.     $start_index=0;
  21.     //计算起始字节偏移量
  22.     for ($i=0;$i<$start;$i++)
  23.     {
  24.         if (ord($str_input{$start_index}>=161))          //是汉语      
  25.         {
  26.             $start_index+=2;
  27.         }
  28.         else                                          //是英文
  29.         {
  30.             $start_index+=1;
  31.         }         
  32.     }     
  33.     $chr_index=$start_index;
  34.     //截取
  35.     for ($i=0;$i<$len;$i++)
  36.     {
  37.         $asc=ord($str_input{$chr_index});
  38.         if ($asc>=161)
  39.         {
  40.             $return_str{$i}=chr($asc);
  41.             $return_str{$i+1}=chr(ord($str_input{$chr_index+1}));
  42.             $len+=1; //结束条件加1
  43.             $i++;    //位置偏移量加1
  44.             $chr_index+=2;
  45.             continue;            
  46.         }
  47.         else  
  48.         {
  49.             $return_str{$i}=chr($asc);
  50.             $chr_index+=1;
  51.         }
  52.     }     
  53.     return trim($return_str);
  54. }//end of substr_cn
  55. ?>
复制代码
本文来自: http://www.likebeta.com/chinese- ... roblem-solving.html

作者: 听老歌   发布时间: 2011-04-06

我的做法一般是先urlencode之后再进行,sbustr()

作者: a.a   发布时间: 2011-04-06

本帖最后由 stabilization 于 2011-04-06 17:40 编辑

俺和楼上同做法

但是是substr

作者: stabilization   发布时间: 2011-04-06