字体:  

参照资料改写了一个截取gbk的函数,大家给点意见

wwd 发表于: 2007-3-23 13:59 来源: PHPChina 开源社区门户

以前的概念是:GBK编码的范围是:高字节从0x81到0xFE,低字节从0x40到0xFE,同时不包括0x7F。后来又有关于GBK字符集的介绍.
  GBK字符集范围  
分区                                                            高位                                   低位  
----------------------------------------------  
●GBK/1:GB2312非汉字符号:                           A1~A9                              A1~FE  
●GBK/2:GB2312汉字      :                              B0~F7                               A1~FE  
●GBK/3:扩充汉字        :                                 81~A0                              40~FE  
●GBK/4:扩充汉字        :                                 AA~FE                              40~A0  
●GBK/5:扩充非汉字      :                                A8~A9                              40~A0

我改了一个已有的截取函数,但是不知道效果怎么样,大家帮忙看看有什么问题不?

function gbksubstr($string,$start,$length,$pop = '')   
{
  $str="";
  $str_len=$start+$length;
  for($i=$start;$i<$str_len;$i++)
{
if((ord(substr($string,$i,1))>0xB0 && ord(substr($string,$i,1))<0xF7) || (ord(substr($string,$i,1))>0x81 && ord(substr($string,$i,1))<0xA0) || (ord(substr($string,$i,1))>0xAA && ord(substr($string,$i,1))<0xFE))
  {   
   $str.=substr($string,$i,2);   
      $i++;   
    }   
    else
  {
   $str.=substr($string,$i,1);
}

  }
   if(strlen($string)>$length)         
       return $str.$pop;
   else
    return $str;
}

[ 本帖最后由 wwd 于 2007-3-23 14:02 编辑 ]

最新回复

PHPChina at 2007-3-23 14:47:48
$pop代表什么意思?
wwd at 2007-3-23 15:11:59
后面追加的一些符号,比如...
冬天来了 at 2007-3-26 20:26:43
干嘛分那么细?
wwd at 2007-3-27 13:13:07

QUOTE:

原帖由 冬天来了 于 2007-3-26 20:26 发表
干嘛分那么细?
我的思路是对gbk中的汉字部分进行多字节截取,而非汉字部分不做特殊处理;既然gbk中汉字部分有这么几段,那我觉得理所当然的应该这么写?不知道你的意思呢?或者说你觉得应该怎么写?
冬天来了 at 2007-3-28 14:13:44
只需要把单字节和双字节的分出来就行了啊
wwd at 2007-3-28 15:30:38
发现对这段话截取的话会出现问题:
对越反击战:割越军耳朵计算人数
正在研究中,最近太忙啦
冬天来了 at 2007-3-28 16:36:30
以下是Discuz的

CODE:


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