在看一个cm是系统时看到一个截取字符串的函数,没看明白,请高手指教。谢谢了。^_^ #[截取字符长度,仅支持UTF-8]
function cut($string,$length,$dot="…")
{
if(strlen($string) <= $length)
{
return $string;
}
$strcut = '';
$n = $tn = $noc = 0;
while ($n < strlen($string))
{
$t = ord($string[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126))
{
$tn = 1; $n++; $noc++;
}
elseif(194 <= $t && $t <= 223)
{
$tn = 2; $n += 2; $noc += 2;
}
elseif(224 <= $t && $t < 239)
{
$tn = 3; $n += 3; $noc += 2;
}
elseif(240 <= $t && $t <= 247)
{
$tn = 4; $n += 4; $noc += 2;
}
elseif(248 <= $t && $t <= 251)
{
$tn = 5; $n += 5; $noc += 2;
}
elseif($t == 252 || $t == 253)
{
$tn = 6; $n += 6; $noc += 2;
}
else
{
$n++;
} if ($noc >= $length)
{
break;
}
}
if ($noc > $length)
{
$n -= $tn;
}
$strcut = substr($string, 0, $n);
return $strcut.$dot;
}对gbk和utf-8编码中汉字的编码范围和他们与ascii码间关系不明白。高手指教,不胜感激

解决方案 »

  1.   

    UTF-8
    http://zh.wikipedia.org/wiki/UTF-8GB 18030 
    http://zh.wikipedia.org/w/index.php?title=GB18030&variant=zh-cn UTF8和GB18030都是变字节的,所以$tn的增加幅度不同UTF8 和 ascii的关系如下 http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec
      

  2.   

    这个问题已经解决了,utf-8是变长编码,一个字符可占用1-6个字节,根据字符首字节范围确定每个字符占几个字节,具体可到我的blog上