以前的概念是: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 编辑 ]


最新回复
QUOTE:
我的思路是对gbk中的汉字部分进行多字节截取,而非汉字部分不做特殊处理;既然gbk中汉字部分有这么几段,那我觉得理所当然的应该这么写?不知道你的意思呢?或者说你觉得应该怎么写?对越反击战:割越军耳朵计算人数
正在研究中,最近太忙啦
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;
}