文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>dedecms4的utf8改版中文截取出错解决函数

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;
}


相关阅读 更多 +
排行榜 更多 +
jojo的奇妙冒险手机版下载

jojo的奇妙冒险手机版下载

飞行射击 下载
雪糕工厂 v9.87.13.02 安卓版

雪糕工厂 v9.87.13.02 安卓版

休闲益智 下载
雪糕工厂 v9.87.13.02 安卓版

雪糕工厂 v9.87.13.02 安卓版

休闲益智 下载