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

简介:

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

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

库文件在include/data下

Java代码   收藏代码
  1. <?php  if(!defined('DEDEINC')) exit('dedecms');  
  2. /** 
  3.  * DedeCMS中用到的字符编码转换的小助手函数 
  4.  * 
  5.  * @version        $Id: charset.helper.php 1 2010-07-05 11:43:09Z tianya $ 
  6.  * @package        DedeCMS.Helpers 
  7.  * @copyright      Copyright (c) 2007 - 2010, DesDev, Inc. 
  8.  * @license        http://help.dedecms.com/usersguide/license.html 
  9.  * @link           http://www.dedecms.com 
  10.  */  
  11.   
  12.   
  13. $UC2GBTABLE = $CODETABLE = $BIG5_DATA = $GB_DATA = '';  
  14. $GbkUniDic = null;  
  15.   
  16. /** 
  17.  *  UTF-8 转GB编码 
  18.  * 
  19.  * @access    public 
  20.  * @param     string  $utfstr  需要转换的字符串 
  21.  * @return    string 
  22.  */  
  23. if ( ! function_exists('utf82gb'))  
  24. {  
  25.     function utf82gb($utfstr)  
  26.     {  
  27.         if(function_exists('iconv'))  
  28.         {  
  29.             return iconv('utf-8','gbk//ignore',$utfstr);  
  30.         }  
  31.         global $UC2GBTABLE;  
  32.         $okstr = "";  
  33.         if(trim($utfstr)=="")  
  34.         {  
  35.             return $utfstr;  
  36.         }  
  37.         if(empty($UC2GBTABLE))  
  38.         {  
  39.             $filename = DEDEINC."/data/gb2312-utf8.dat";  
  40.             $fp = fopen($filename,"r");  
  41.             while($l = fgets($fp,15))  
  42.             {  
  43.                 $UC2GBTABLE[hexdec(substr($l, 76))] = hexdec(substr($l, 06));  
  44.             }  
  45.             fclose($fp);  
  46.         }  
  47.         $okstr = "";  
  48.         $ulen = strlen($utfstr);  
  49.         for($i=0;$i<$ulen;$i++)  
  50.         {  
  51.             $c = $utfstr[$i];  
  52.             $cb = decbin(ord($utfstr[$i]));  
  53.             if(strlen($cb)==8)  
  54.             {  
  55.                 $csize = strpos(decbin(ord($cb)),"0");  
  56.                 for($j=0;$j < $csize;$j++)  
  57.                 {  
  58.                     $i++; $c .= $utfstr[$i];  
  59.                 }  
  60.                 $c = utf82u($c);  
  61.                 if(isset($UC2GBTABLE[$c]))  
  62.                 {  
  63.                     $c = dechex($UC2GBTABLE[$c]+0x8080);  
  64.                     $okstr .= chr(hexdec($c[0].$c[1])).chr(hexdec($c[2].$c[3]));  
  65.                 }  
  66.                 else  
  67.                 {  
  68.                     $okstr .= "&#".$c.";";  
  69.                 }  
  70.             }  
  71.             else  
  72.             {  
  73.                 $okstr .= $c;  
  74.             }  
  75.         }  
  76.         $okstr = trim($okstr);  
  77.         return $okstr;  
  78.     }  
  79. }  
  80.   
  81. /** 
  82.  *  GB转UTF-8编码 
  83.  * 
  84.  * @access    public 
  85.  * @param     string  $gbstr  gbk的字符串 
  86.  * @return    string 
  87.  */  
  88. if ( ! function_exists('gb2utf8'))  
  89. {  
  90.     function gb2utf8($gbstr)  
  91.     {  
  92.         if(function_exists('iconv'))  
  93.         {  
  94.             return iconv('gbk','utf-8//ignore',$gbstr);  
  95.         }  
  96.         global $CODETABLE;  
  97.         if(trim($gbstr)=="")  
  98.         {  
  99.             return $gbstr;  
  100.         }  
  101.         if(empty($CODETABLE))  
  102.         {  
  103.             $filename = DEDEINC."/data/gb2312-utf8.dat";  
  104.             $fp = fopen($filename,"r");  
  105.             while ($l = fgets($fp,15))  
  106.             {  
  107.                 $CODETABLE[hexdec(substr($l, 06))] = substr($l, 76);  
  108.             }  
  109.             fclose($fp);  
  110.         }  
  111.         $ret = "";  
  112.         $utf8 = "";  
  113.         while ($gbstr != '')  
  114.         {  
  115.             if (ord(substr($gbstr, 01)) > 0x80)  
  116.             {  
  117.                 $thisW = substr($gbstr, 02);  
  118.                 $gbstr = substr($gbstr, 2, strlen($gbstr));  
  119.                 $utf8 = "";  
  120.                 @$utf8 = u2utf8(hexdec($CODETABLE[hexdec(bin2hex($thisW)) - 0x8080]));  
  121.                 if($utf8!="")  
  122.                 {  
  123.                     for ($i = 0;$i < strlen($utf8);$i += 3)  
  124.                     $ret .= chr(substr($utf8, $i, 3));  
  125.                 }  
  126.             }  
  127.             else  
  128.             {  
  129.                 $ret .= substr($gbstr, 01);  
  130.                 $gbstr = substr($gbstr, 1, strlen($gbstr));  
  131.             }  
  132.         }  
  133.         return $ret;  
  134.     }  
  135. }  
  136.   
  137. /** 
  138.  *  Unicode转utf8 
  139.  * 
  140.  * @access    public 
  141.  * @param     string  $c  Unicode的字符串内容 
  142.  * @return    string 
  143.  */  
  144. if ( ! function_exists('u2utf8'))  
  145. {  
  146.     function u2utf8($c)  
  147.     {  
  148.         for ($i = 0;$i < count($c);$i++)  
  149.         {  
  150.             $str = "";  
  151.         }  
  152.         if ($c < 0x80)  
  153.         {  
  154.             $str .= $c;  
  155.         }  
  156.         else if ($c < 0x800)  
  157.         {  
  158.             $str .= (0xC0 | $c >> 6);  
  159.             $str .= (0x80 | $c & 0x3F);  
  160.         }  
  161.         else if ($c < 0x10000)  
  162.         {  
  163.             $str .= (0xE0 | $c >> 12);  
  164.             $str .= (0x80 | $c >> 6 & 0x3F);  
  165.             $str .= (0x80 | $c & 0x3F);  
  166.         }  
  167.         else if ($c < 0x200000)  
  168.         {  
  169.             $str .= (0xF0 | $c >> 18);  
  170.             $str .= (0x80 | $c >> 12 & 0x3F);  
  171.             $str .= (0x80 | $c >> 6 & 0x3F);  
  172.             $str .= (0x80 | $c & 0x3F);  
  173.         }  
  174.         return $str;  
  175.     }  
  176. }  
  177.   
  178. /** 
  179.  *  utf8转Unicode 
  180.  * 
  181.  * @access    public 
  182.  * @param     string  $c  UTF-8的字符串信息 
  183.  * @return    string 
  184.  */  
  185. if ( ! function_exists('utf82u'))  
  186. {  
  187.     function utf82u($c)  
  188.     {  
  189.         switch(strlen($c))  
  190.         {  
  191.             case 1:  
  192.                 return ord($c);  
  193.             case 2:  
  194.                 $n = (ord($c[0]) & 0x3f) << 6;  
  195.                 $n += ord($c[1]) & 0x3f;  
  196.                 return $n;  
  197.             case 3:  
  198.                 $n = (ord($c[0]) & 0x1f) << 12;  
  199.                 $n += (ord($c[1]) & 0x3f) << 6;  
  200.                 $n += ord($c[2]) & 0x3f;  
  201.                 return $n;  
  202.             case 4:  
  203.                 $n = (ord($c[0]) & 0x0f) << 18;  
  204.                 $n += (ord($c[1]) & 0x3f) << 12;  
  205.                 $n += (ord($c[2]) & 0x3f) << 6;  
  206.                 $n += ord($c[3]) & 0x3f;  
  207.                 return $n;  
  208.         }  
  209.     }  
  210. }  
  211.   
  212. /** 
  213.  *  Big5码转换成GB码 
  214.  * 
  215.  * @access    public 
  216.  * @param     string   $Text  字符串内容 
  217.  * @return    string 
  218.  */  
  219. if ( ! function_exists('big52gb'))  
  220. {  
  221.     function big52gb($Text)  
  222.     {  
  223.         if(function_exists('iconv'))  
  224.         {  
  225.             return iconv('big5','gbk//ignore',$Text);  
  226.         }  
  227.         global $BIG5_DATA;  
  228.         if(empty($BIG5_DATA))  
  229.         {  
  230.             $filename = DEDEINC."/data/big5-gb.dat";  
  231.             $fp = fopen($filename, "rb");  
  232.             $BIG5_DATA = fread($fp,filesize($filename));  
  233.             fclose($fp);  
  234.         }  
  235.         $max = strlen($Text)-1;  
  236.         for($i=0;$i<$max;$i++)  
  237.         {  
  238.             $h = ord($Text[$i]);  
  239.             if($h>=0x80)  
  240.             {  
  241.                 $l = ord($Text[$i+1]);  
  242.                 if($h==161 && $l==64)  
  243.                 {  
  244.                     $gbstr = " ";  
  245.                 }  
  246.                 else  
  247.                 {  
  248.                     $p = ($h-160)*510+($l-1)*2;  
  249.                     $gbstr = $BIG5_DATA[$p].$BIG5_DATA[$p+1];  
  250.                 }  
  251.                 $Text[$i] = $gbstr[0];  
  252.                 $Text[$i+1] = $gbstr[1];  
  253.                 $i++;  
  254.             }  
  255.         }  
  256.         return $Text;  
  257.     }  
  258. }  
  259.   
  260. /** 
  261.  *  GB码转换成Big5码 
  262.  * 
  263.  * @access    public 
  264.  * @param     string  $Text 字符串内容 
  265.  * @return    string 
  266.  */  
  267. if ( ! function_exists('gb2big5'))  
  268. {  
  269.     function gb2big5($Text)  
  270.     {  
  271.         if(function_exists('iconv'))  
  272.         {  
  273.             return iconv('gbk','big5//ignore',$Text);  
  274.         }  
  275.         global $GB_DATA;  
  276.         if(empty($GB_DATA))  
  277.         {  
  278.             $filename = DEDEINC."/data/gb-big5.dat";  
  279.             $fp = fopen($filename, "rb");  
  280.             $gb = fread($fp,filesize($filename));  
  281.             fclose($fp);  
  282.         }  
  283.         $max = strlen($Text)-1;  
  284.         for($i=0;$i<$max;$i++)  
  285.         {  
  286.             $h = ord($Text[$i]);  
  287.             if($h>=0x80)  
  288.             {  
  289.                 $l = ord($Text[$i+1]);  
  290.                 if($h==161 && $l==64)  
  291.                 {  
  292.                     $big = " ";  
  293.                 }  
  294.                 else  
  295.                 {  
  296.                     $p = ($h-160)*510+($l-1)*2;  
  297.                     $big = $GB_DATA[$p].$GB_DATA[$p+1];  
  298.                 }  
  299.                 $Text[$i] = $big[0];  
  300.                 $Text[$i+1] = $big[1];  
  301.                 $i++;  
  302.             }  
  303.         }  
  304.         return $Text;  
  305.     }  
  306. }  
  307.   
  308. /** 
  309.  *  unicode url编码转gbk编码函数 
  310.  * 
  311.  * @access    public 
  312.  * @param     string  $str  转换的内容 
  313.  * @return    string 
  314.  */  
  315. if ( ! function_exists('UnicodeUrl2Gbk'))  
  316. {  
  317.     function UnicodeUrl2Gbk($str)  
  318.     {  
  319.         //载入对照词典  
  320.         if(!isset($GLOBALS['GbkUniDic']))  
  321.         {  
  322.             $fp = fopen(DEDEINC.'/data/gbk-unicode.dat','rb');  
  323.             while(!feof($fp))  
  324.             {  
  325.                 $GLOBALS['GbkUniDic'][bin2hex(fread($fp,2))] = fread($fp,2);  
  326.             }  
  327.             fclose($fp);  
  328.         }  
  329.   
  330.         //处理字符串  
  331.         $str = str_replace('$#$','+',$str);  
  332.         $glen = strlen($str);  
  333.         $okstr = "";  
  334.         for($i=0; $i < $glen; $i++)  
  335.         {  
  336.             if($glen-$i > 4)  
  337.             {  
  338.                 if($str[$i]=='%' && $str[$i+1]=='u')  
  339.                 {  
  340.                     $uni = strtolower(substr($str,$i+2,4));  
  341.                     $i = $i+5;  
  342.                     if(isset($GLOBALS['GbkUniDic'][$uni]))  
  343.                     {  
  344.                         $okstr .= $GLOBALS['GbkUniDic'][$uni];  
  345.                     }  
  346.                     else  
  347.                     {  
  348.                         $okstr .= "&#".hexdec('0x'.$uni).";";  
  349.                     }  
  350.                 }  
  351.                 else  
  352.                 {  
  353.                     $okstr .= $str[$i];  
  354.                 }  
  355.             }  
  356.             else  
  357.             {  
  358.                 $okstr .= $str[$i];  
  359.             }  
  360.         }  
  361.         return $okstr;  
  362.     }  
  363. }  
  364.   
  365. /** 
  366.  *  自动转换字符集 支持数组转换 
  367.  * 
  368.  * @access    public 
  369.  * @param     string  $str  转换的内容 
  370.  * @return    string 
  371.  */  
  372. if ( ! function_exists('AutoCharset'))  
  373. {  
  374.     function AutoCharset($fContents, $from='gbk', $to='utf-8')  
  375.     {  
  376.         $from   =  strtoupper($from)=='UTF8''utf-8' : $from;  
  377.         $to       =  strtoupper($to)=='UTF8''utf-8' : $to;  
  378.         if( strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents)) ){  
  379.             //如果编码相同或者非字符串标量则不转换  
  380.             return $fContents;  
  381.         }  
  382.         if(is_string($fContents) )   
  383.         {  
  384.             if(function_exists('mb_convert_encoding'))  
  385.             {  
  386.                 return mb_convert_encoding ($fContents, $to, $from);  
  387.             } elseif (function_exists('iconv'))  
  388.             {  
  389.                 return iconv($from, $to, $fContents);  
  390.             } else {  
  391.                 return $fContents;  
  392.             }  
  393.         }  
  394.         elseif(is_array($fContents))  
  395.         {  
  396.             foreach ( $fContents as $key => $val )   
  397.             {  
  398.                 $_key =     AutoCharset($key,$from,$to);  
  399.                 $fContents[$_key] = AutoCharset($val,$from,$to);  
  400.                 if($key != $_key )  
  401.                     unset($fContents[$key]);  
  402.             }  
  403.             return $fContents;  
  404.         }  
  405.         else{  
  406.             return $fContents;  
  407.         }  
  408.     }  
  409. }  
  410. ?>  
相关文章
|
Oracle 关系型数据库 Java
解决读取Oracle数据库US7ASCII编码乱码问题
今天和第三方对接数据时,对方提供了一个视图US7ASCII编码,给代码调试带来了很大的不便。程序输出的mybatis获取的对象及new String(s.getBytes("ISO8859-1"), "GB2312")加解密后都是乱码。
1445 1
|
7月前
libreoffice转换文件乱码
libreoffice转换文件乱码
|
11月前
MobaXterm中文乱码编码问题,无需修改系统编码,GB2312
MobaXterm中文乱码编码问题,无需修改系统编码,GB2312
|
编译器 Shell Linux
VS2019 高级保存设置UTF-8编码-源代码乱码问题
VS2019 高级保存设置UTF-8编码-源代码乱码问题
898 0
VS2019 高级保存设置UTF-8编码-源代码乱码问题
|
JavaScript
nodejs使用axios 读取gbk编码乱码转化
在通过axios读取页面的时候,经常会碰到gbk的编码,如果不进行转化的话,在获取信息或读取上都会很麻烦。
nodejs使用axios 读取gbk编码乱码转化
错误:编码GBK的不可映射字符的解决办法
最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后emmmm....我找到了错误原因以及解决办法: 错误原因:在控制台编译java源文件时 未使用UTF-8编码格式 由于java的JDK环境是国际版本的编码格式,默认格式为UNICODE的编码格式,而我们国内现在较多使用的编码格式多位UTF-8以及GB2312等编码格式,所以我们要在控制台更改java源程序的编码格式。
5470 0