`
hudeyong926
  • 浏览: 2028397 次
  • 来自: 武汉
社区版块
存档分类
最新评论

DedeCMS中用到的字符编码转换1

阅读更多

PHP自带的iconv和mbstring库都可以完成这项工作,但一般的虚拟主机很少支持

其中的全局变量在include/common.inc.php

库文件在include/data下

<?php  if(!defined('DEDEINC')) exit('dedecms');
/**
 * DedeCMS中用到的字符编码转换的小助手函数
 *
 * @version        $Id: charset.helper.php 1 2010-07-05 11:43:09Z tianya $
 * @package        DedeCMS.Helpers
 * @copyright      Copyright (c) 2007 - 2010, DesDev, Inc.
 * @license        http://help.dedecms.com/usersguide/license.html
 * @link           http://www.dedecms.com
 */


$UC2GBTABLE = $CODETABLE = $BIG5_DATA = $GB_DATA = '';
$GbkUniDic = null;

/**
 *  UTF-8 转GB编码
 *
 * @access    public
 * @param     string  $utfstr  需要转换的字符串
 * @return    string
 */
if ( ! function_exists('utf82gb'))
{
    function utf82gb($utfstr)
    {
        if(function_exists('iconv'))
        {
            return iconv('utf-8','gbk//ignore',$utfstr);
        }
        global $UC2GBTABLE;
        $okstr = "";
        if(trim($utfstr)=="")
        {
            return $utfstr;
        }
        if(empty($UC2GBTABLE))
        {
            $filename = DEDEINC."/data/gb2312-utf8.dat";
            $fp = fopen($filename,"r");
            while($l = fgets($fp,15))
            {
                $UC2GBTABLE[hexdec(substr($l, 7, 6))] = hexdec(substr($l, 0, 6));
            }
            fclose($fp);
        }
        $okstr = "";
        $ulen = strlen($utfstr);
        for($i=0;$i<$ulen;$i++)
        {
            $c = $utfstr[$i];
            $cb = decbin(ord($utfstr[$i]));
            if(strlen($cb)==8)
            {
                $csize = strpos(decbin(ord($cb)),"0");
                for($j=0;$j < $csize;$j++)
                {
                    $i++; $c .= $utfstr[$i];
                }
                $c = utf82u($c);
                if(isset($UC2GBTABLE[$c]))
                {
                    $c = dechex($UC2GBTABLE[$c]+0x8080);
                    $okstr .= chr(hexdec($c[0].$c[1])).chr(hexdec($c[2].$c[3]));
                }
                else
                {
                    $okstr .= "&#".$c.";";
                }
            }
            else
            {
                $okstr .= $c;
            }
        }
        $okstr = trim($okstr);
        return $okstr;
    }
}

/**
 *  GB转UTF-8编码
 *
 * @access    public
 * @param     string  $gbstr  gbk的字符串
 * @return    string
 */
if ( ! function_exists('gb2utf8'))
{
    function gb2utf8($gbstr)
    {
        if(function_exists('iconv'))
        {
            return iconv('gbk','utf-8//ignore',$gbstr);
        }
        global $CODETABLE;
        if(trim($gbstr)=="")
        {
            return $gbstr;
        }
        if(empty($CODETABLE))
        {
            $filename = DEDEINC."/data/gb2312-utf8.dat";
            $fp = fopen($filename,"r");
            while ($l = fgets($fp,15))
            {
                $CODETABLE[hexdec(substr($l, 0, 6))] = substr($l, 7, 6);
            }
            fclose($fp);
        }
        $ret = "";
        $utf8 = "";
        while ($gbstr != '')
        {
            if (ord(substr($gbstr, 0, 1)) > 0x80)
            {
                $thisW = substr($gbstr, 0, 2);
                $gbstr = substr($gbstr, 2, strlen($gbstr));
                $utf8 = "";
                @$utf8 = u2utf8(hexdec($CODETABLE[hexdec(bin2hex($thisW)) - 0x8080]));
                if($utf8!="")
                {
                    for ($i = 0;$i < strlen($utf8);$i += 3)
                    $ret .= chr(substr($utf8, $i, 3));
                }
            }
            else
            {
                $ret .= substr($gbstr, 0, 1);
                $gbstr = substr($gbstr, 1, strlen($gbstr));
            }
        }
        return $ret;
    }
}

/**
 *  Unicode转utf8
 *
 * @access    public
 * @param     string  $c  Unicode的字符串内容
 * @return    string
 */
if ( ! function_exists('u2utf8'))
{
    function u2utf8($c)
    {
        for ($i = 0;$i < count($c);$i++)
        {
            $str = "";
        }
        if ($c < 0x80)
        {
            $str .= $c;
        }
        else if ($c < 0x800)
        {
            $str .= (0xC0 | $c >> 6);
            $str .= (0x80 | $c & 0x3F);
        }
        else if ($c < 0x10000)
        {
            $str .= (0xE0 | $c >> 12);
            $str .= (0x80 | $c >> 6 & 0x3F);
            $str .= (0x80 | $c & 0x3F);
        }
        else if ($c < 0x200000)
        {
            $str .= (0xF0 | $c >> 18);
            $str .= (0x80 | $c >> 12 & 0x3F);
            $str .= (0x80 | $c >> 6 & 0x3F);
            $str .= (0x80 | $c & 0x3F);
        }
        return $str;
    }
}

/**
 *  utf8转Unicode
 *
 * @access    public
 * @param     string  $c  UTF-8的字符串信息
 * @return    string
 */
if ( ! function_exists('utf82u'))
{
    function utf82u($c)
    {
        switch(strlen($c))
        {
            case 1:
                return ord($c);
            case 2:
                $n = (ord($c[0]) & 0x3f) << 6;
                $n += ord($c[1]) & 0x3f;
                return $n;
            case 3:
                $n = (ord($c[0]) & 0x1f) << 12;
                $n += (ord($c[1]) & 0x3f) << 6;
                $n += ord($c[2]) & 0x3f;
                return $n;
            case 4:
                $n = (ord($c[0]) & 0x0f) << 18;
                $n += (ord($c[1]) & 0x3f) << 12;
                $n += (ord($c[2]) & 0x3f) << 6;
                $n += ord($c[3]) & 0x3f;
                return $n;
        }
    }
}

/**
 *  Big5码转换成GB码
 *
 * @access    public
 * @param     string   $Text  字符串内容
 * @return    string
 */
if ( ! function_exists('big52gb'))
{
    function big52gb($Text)
    {
        if(function_exists('iconv'))
        {
            return iconv('big5','gbk//ignore',$Text);
        }
        global $BIG5_DATA;
        if(empty($BIG5_DATA))
        {
            $filename = DEDEINC."/data/big5-gb.dat";
            $fp = fopen($filename, "rb");
            $BIG5_DATA = fread($fp,filesize($filename));
            fclose($fp);
        }
        $max = strlen($Text)-1;
        for($i=0;$i<$max;$i++)
        {
            $h = ord($Text[$i]);
            if($h>=0x80)
            {
                $l = ord($Text[$i+1]);
                if($h==161 && $l==64)
                {
                    $gbstr = " ";
                }
                else
                {
                    $p = ($h-160)*510+($l-1)*2;
                    $gbstr = $BIG5_DATA[$p].$BIG5_DATA[$p+1];
                }
                $Text[$i] = $gbstr[0];
                $Text[$i+1] = $gbstr[1];
                $i++;
            }
        }
        return $Text;
    }
}

/**
 *  GB码转换成Big5码
 *
 * @access    public
 * @param     string  $Text 字符串内容
 * @return    string
 */
if ( ! function_exists('gb2big5'))
{
    function gb2big5($Text)
    {
        if(function_exists('iconv'))
        {
            return iconv('gbk','big5//ignore',$Text);
        }
        global $GB_DATA;
        if(empty($GB_DATA))
        {
            $filename = DEDEINC."/data/gb-big5.dat";
            $fp = fopen($filename, "rb");
            $gb = fread($fp,filesize($filename));
            fclose($fp);
        }
        $max = strlen($Text)-1;
        for($i=0;$i<$max;$i++)
        {
            $h = ord($Text[$i]);
            if($h>=0x80)
            {
                $l = ord($Text[$i+1]);
                if($h==161 && $l==64)
                {
                    $big = " ";
                }
                else
                {
                    $p = ($h-160)*510+($l-1)*2;
                    $big = $GB_DATA[$p].$GB_DATA[$p+1];
                }
                $Text[$i] = $big[0];
                $Text[$i+1] = $big[1];
                $i++;
            }
        }
        return $Text;
    }
}

/**
 *  unicode url编码转gbk编码函数
 *
 * @access    public
 * @param     string  $str  转换的内容
 * @return    string
 */
if ( ! function_exists('UnicodeUrl2Gbk'))
{
    function UnicodeUrl2Gbk($str)
    {
        //载入对照词典
        if(!isset($GLOBALS['GbkUniDic']))
        {
            $fp = fopen(DEDEINC.'/data/gbk-unicode.dat','rb');
            while(!feof($fp))
            {
                $GLOBALS['GbkUniDic'][bin2hex(fread($fp,2))] = fread($fp,2);
            }
            fclose($fp);
        }

        //处理字符串
        $str = str_replace('$#$','+',$str);
        $glen = strlen($str);
        $okstr = "";
        for($i=0; $i < $glen; $i++)
        {
            if($glen-$i > 4)
            {
                if($str[$i]=='%' && $str[$i+1]=='u')
                {
                    $uni = strtolower(substr($str,$i+2,4));
                    $i = $i+5;
                    if(isset($GLOBALS['GbkUniDic'][$uni]))
                    {
                        $okstr .= $GLOBALS['GbkUniDic'][$uni];
                    }
                    else
                    {
                        $okstr .= "&#".hexdec('0x'.$uni).";";
                    }
                }
                else
                {
                    $okstr .= $str[$i];
                }
            }
            else
            {
                $okstr .= $str[$i];
            }
        }
        return $okstr;
    }
}

/**
 *  自动转换字符集 支持数组转换
 *
 * @access    public
 * @param     string  $str  转换的内容
 * @return    string
 */
if ( ! function_exists('AutoCharset'))
{
    function AutoCharset($fContents, $from='gbk', $to='utf-8')
    {
        $from   =  strtoupper($from)=='UTF8'? 'utf-8' : $from;
        $to       =  strtoupper($to)=='UTF8'? 'utf-8' : $to;
        if( strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents)) ){
            //如果编码相同或者非字符串标量则不转换
            return $fContents;
        }
        if(is_string($fContents) ) 
        {
            if(function_exists('mb_convert_encoding'))
            {
                return mb_convert_encoding ($fContents, $to, $from);
            } elseif (function_exists('iconv'))
            {
                return iconv($from, $to, $fContents);
            } else {
                return $fContents;
            }
        }
        elseif(is_array($fContents))
        {
            foreach ( $fContents as $key => $val ) 
            {
                $_key =     AutoCharset($key,$from,$to);
                $fContents[$_key] = AutoCharset($val,$from,$to);
                if($key != $_key )
                    unset($fContents[$key]);
            }
            return $fContents;
        }
        else{
            return $fContents;
        }
    }
}
?>
分享到:
评论

相关推荐

    [CMS程序]Dedecms 5.3 到 phpcms 2008 转换程序_dedecms_to_2008.zip

    【CMS程序】Dedecms 5.3到phpcms 2008转换程序是针对两种不同内容管理系统(CMS)的数据迁移工具。这个过程涉及到将一个网站从DedeCMS 5.3版本升级或迁移至phpcms 2008版本。DedeCMS和phpcms都是国内广泛应用的开源...

    织梦dedecms在线客服插件GBK+utf-8两种编码_插件_

    这个插件包含了GBK和UTF-8两种字符编码版本,以适应不同用户的需求。 GBK编码是中国大陆地区广泛使用的汉字编码标准,它是GB2312编码的扩展,能够支持更多的汉字和符号。而UTF-8是一种无损的多字节编码方式,它能够...

    PHP实例开发源码——织梦内容管理系统DedeCms UTF-8升级程序.zip

    升级过程通常涉及到数据库表的编码转换、模板文件的编码修改以及可能存在的配置文件调整。 【知识点详解】: 1. PHP:这是一种广泛应用的开源服务器端脚本语言,尤其适用于Web开发,并可嵌入HTML中。PHP支持多种...

    在线艺术字生成器-DedeCMS源码-支持字体转换与自定义-适用于网站设计

    创造专属艺术字-字体定制-系统源码-支持自定义字体/在线艺术字体转换器 您现在可以随心所欲地在线生成、转换和设计艺术字体。我们的系统源码以html为主, 虽然基于DedeCMS内核,但赋予您无限的可能性。后台管理...

    UTF-8_To_GBK的软件源码

    UTF-8 和 GBK 是两种不同的字符编码标准,它们在计算机处理中文字符时起到至关重要的作用。这篇关于“UTF-8_To_GBK”的软件源码分析将深入探讨这两种编码的区别,以及如何在VB(Visual Basic)环境中进行编码转换。 ...

    DEDECMS5.7后台getshell1

    在上传时,DEDECMS 5.7后台将该文件名中的特殊字符替换成空格,从而使文件名变为"1.jpg"。但是,攻击者可以通过在文件名前添加特殊字符来 bypass DEDECMS 5.7后台的安全检查。例如,攻击者可以上传一个名为"1....

    DedeCMS 存储型xss漏洞1

    【DedeCMS 存储型 XSS 漏洞1】详解 DedeCMS 是一款广泛使用的基于PHP的开源网站管理系统,其特色在于提供了一个简洁易用的后台管理界面,帮助企业或个人快速构建网站。然而,如同任何软件一样,DedeCMS 也存在安全...

    [CMS程序]Dedecms 5.3 到 phpcms 2008 转换程序_dedecms_to_2008.rar

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。...【项目质量】:所有源码都经过严格测试,可以直接...

    Dedecms存在储存型跨站脚本漏洞1

    标题提及的"Dedecms存在储存型跨站脚本漏洞1"主要涉及到的是Dedecms网站管理系统的一个安全问题,具体来说,这是一个由于程序代码过滤不足导致的存储型跨站脚本( Stored Cross-Site Scripting, XSS )漏洞。Dedecms...

    基于PHP的UCenter Home 简体GB2312与UTF-8.zip

    并确保所有涉及到字符编码的配置项都正确设置。 4. 网页头部声明: 在HTML文件中,添加或修改字符集声明,以确保浏览器正确解析页面内容: ```html ``` 5. 用户界面适配: 如果用户界面有部分元素显示不...

    dedecms批量漏洞扫描.zip_dedecms_dedecms 扫描器_dedecms漏洞_dedecms路径扫描_批量扫描

    dedecms批量漏洞扫描,大家可以自己试试效果

    织梦dedecms批量导入excel表文章内容插件

    2. 下载并安装插件:从可靠来源获取织梦DedeCMS批量导入Excel插件,并按照官方文档或说明安装到你的DedeCMS系统中。 3. 设置权限:确保插件具有读取和写入数据库的权限,以便能够正确导入数据。 4. 导入操作:在...

    dedecms一键完美转移wellcms工具.zip

    这个工具旨在简化从DedeCMS到WellCMS的数据转换过程,确保用户在切换系统时不会丢失任何关键信息。以下是这个工具能处理的主要数据类型: 1. **用户数据**:包括用户的注册信息、登录凭证、个人资料等,这些数据的...

    dedecms在线订单发送邮件插件_dedecms_织梦CMS_

    如图所示:dedecms在线订单发送邮件插件用途:访客在线发送信息到您预先设置的邮箱,稍加修改,即可作为订单、反馈、求职等邮件发送。解压包里有安装说明,新手不会的话可以联系站长,或者留言即可。

    基于PHP的DEDECMS站群增强版GBK源码.zip

    该系统支持GBK编码,是一种在中国大陆地区常用的中文字符编码方式,能够处理大部分中文字符,但在处理一些特殊字符或繁体字时可能会遇到问题。 在这个“基于PHP的DEDECMS站群增强版GBK源码.zip”压缩包中,我们主要...

    DedeCMSv5.6英文模板免费UTF8/GBK,蓝色风格.rar

    模板支持两种字符编码格式:UTF8和GBK,UTF8是国际通用的多语言编码,GBK是中国大陆常用的中文编码。"蓝色风格"说明模板采用了蓝色作为主要设计色调,通常蓝色给人以专业、稳重的感觉,适合用于商业或正式场合的网站...

    dedeCMS插件-免费采集伪原创发布推送插件

    **dedeCMS插件-免费采集伪原创发布推送插件** **一、dedeCMS插件介绍** dedeCMS插件是一种专为dedeCMS(织梦内容管理系统)设计的扩展工具,它提供了丰富的功能来增强网站的运营效率和SEO优化。这个免费的插件包含...

    dedecms一键解密工具

    dedecms一键解密工具 用起来方便简单 添加地址直接一键使用 dedecms网络渗透专用

    医院预约挂号系统dedecms插件_gbk.zip

    《医院预约挂号系统dedecms插件_gbk.zip》是一个基于GBK编码的插件,用于增强DEDECMS(织梦内容管理系统)的功能,以便实现在线的医院预约挂号服务。DEDECMS是一款流行的PHP+MySQL开源网站内容管理框架,广泛应用于...

Global site tag (gtag.js) - Google Analytics