dedecms4的utf8改版中文截取出错解决函数
时间:2007-04-13 来源:gydoesit
www.utf8cms.cn
改编的dedecms 4.0 的utf-8版本,在后台发表文章时常出错,提示archives表写出错,改写了相应的php,看到提示,原来是中文截取出错,导致没有引号闭合,所以字段提示tool long.觉得数据库操作的setquery函数的加引号有问题,不过发觉在之前已经变了.在include/inc_functions.php中,有cn_substr函数,这是针对gbk的双字节编码的.所以utf8时出错.于是用下面的函数代替
/**
UTF-8编码的字符可能由1~3个字节组成, 具体数目可以由第一个字节判断出来。(理论上可能更长,但这里假设不超过3个字节)
第一个字节大于224的,它与它之后的2个字节一起组成一个UTF-8字符
第一个字节大于192小于224的,它与它之后的1个字节组成一个UTF-8字符
否则第一个字节本身就是一个英文字符(包括数字和一小部分标点符号)。
参数:str原始字符串,len截取长度,start起始字符位置
*/
function cn_substr($str, $len, $start = 0) {
$restr = '';
$length = strlen($str); //原字节数
if ($len >= $length && $start = 0) {
//本来就不够长,直接返回
return $str;
}
if ($length ($start + 1)) {
//起点已经到尾了,返回空
return '';
}
if ($length $start + $len) {
//起点+截取,超过总长就只到总长
$len = $length - $start;
}
$end = $start + $len; //结束处
$i = 0;
while ($i $end) {
$temp = substr($str, $i, 1);
$asc = ord($temp); //得到$i字节的ascii码
if ($asc >= 224) {
//如ASCII位高于224,3个连续字符为一个宽字符
if ($i >= $start && $i = ($end - 3)) {
$restr .= substr($str, $i, 3);
}
$i += 3;
}elseif ($asc >= 192) {
//如ASCII位高于192,2个连续字符为一个宽字符
if ($i >= $start && $i = ($end - 2)) {
$restr .= substr($str, $i, 2);
}
$i += 2;
}else {
//ASCII为192下的只有一个字节
if ($i >= $start && $i = ($end - 1)) {
$restr .= $temp;
}
$i++;
}
}
return $restr;
}
相关阅读 更多 +
排行榜 更多 +