100分问题,关于utf-8编码中汉字的问题
如题,想精确截取utf-8编码中指定长度的中英文字符串,但好像该编码中汉字和英文的长度都一样为1,如何判断utf-8编码中的某字符是汉字?
------解决方案--------------------有一定范围的。。。至于是多少就不知道了。
------解决方案--------------------帮顶一下学习
------解决方案--------------------up.
------解决方案--------------------utf-8为1-3字节编码,其中ascii兼容字符为1个字节,其他字符为2-3个字节。
简体中文为3个字节,表示为1110aaaa-10bbbbbb-10cccccc,其中的aaaabbbbbbcccccc组合起来就是改编码的unicode形式
对于字符统计,可以用midb读取,然后判断起首位是否为零,为零则是英文字符。假设英文字符总数为AsciiCount,则汉字字符为(lenb-AsciiCount)/3
------解决方案--------------------http://community.csdn.net/Expert/topic/5354/5354620.xml?temp=.2699243
function cut_str($sourcestr,$cutlength)
{
$returnstr= ' ';
$i=0;
$n=0;
$str_length=strlen($sourcestr);//字符串的字节数
while (($n <$cutlength) and ($i <=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
if ($ascnum> =224) //如果ASCII位高与224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
$i=$i+3; //实际Byte计为3
$n++; //字串长度计1
}
elseif ($ascnum> =192) //如果ASCII位高与192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
$i=$i+2; //实际Byte计为2
$n++; //字串长度计1
}
elseif ($ascnum> =65 && $ascnum <=90) //如果是大写字母,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数仍计1个
$n++; //但考虑整体美观,大写字母计成一个高位字符
}
else //其他情况下,包括小写字母和半角标点符号,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数计1个
$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
}
}
if ($str_length> $cutlength){
$returnstr = $returnstr . "... ";//超过长度时在尾处加上省略号
}
return $returnstr;
}
网上找到的.我用过不错,我编程都是UTF8的
------解决方案--------------------mark
------解决方案--------------------喔,不错啊,编程都用UTF8。我一直都还在用GB2312
------解决方案--------------------推荐搂主:
http://www.regexlab.com/zh/encoding.htm
搂主所说的 "汉字和英文的长度都一样为1 " 实际上是 asp 的内部码,就是 "UnicodeLittle 编码 ",不是 utf8 编码。