Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 网站建设 > PHP > dedecms4的utf8改版中文截取出错解决函数
【标  题】:dedecms4的utf8改版中文截取出错解决函数
【关键字】:dedecms4,utf8
【来  源】:http://www.cublog.cn/u/4891/showart.php?id=277005

dedecms4的utf8改版中文截取出错解决函数

Your Ad Here
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;
}

学perl第五天,个人理解perl对比c的显著特点:【上一篇】
工作小结:【下一篇】
【相关文章】
  • UTF8 下中文处理 [转载]
  • MySql: 转换latin1到utf8
  • [Tips]如何计算utf8下的字节数
  • 双字节中文字符集导出的DMP文件导入UTF8字符集
  • Eclipse RCP 中使用UTF8编码出现乱码问题的解决办法
  • GB编码转换为UTF8编码
  • java/mysql/linux utf8经验小结
  • utf8字符串截取
  • 将gb2312编码的文件转换为utf8的Shell脚本
  • 用id3iconv将mp3转换为utf8编码
  • 【随机文章】
  • ARP 和 RARP
  • 数据库快照,自定义函数与计算列
  • 全面保护你的Java程序安全(中)
  • QQ帮你突破网吧硬盘访问限制
  • 如何突破XP正版验证?
  • VS20005, Smart device vc++ , 不再支持的类
  • js也可以有自定义事件 注入就是这么爽
  • ISDN系列测试仪表
  • 鸟哥的linx下的网络命令
  • 没有图形界面下怎么设置代理上网?
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.