返回列表 发帖

PHP编码转换类

<?php
/**
* @copyright 互联网
* 整理:www.phppx.com
* @desc PHP编码转换类
*
  1. /*   
  2. * 编码转换     
  3. * 说明:   
  4. * jsonencode 有参考Services_JSON 但有很大区别 此处可以将utf-8 gb2312 big5都可以jsonencode   
  5. * jsondecode 自己原创 该算法是模拟目录读取的方法   
  6. *   可以将json中中文unicode编码unescape为gbk big5 utf8   
  7. */   
  8. define('TABLE_DIR','./table');
  9. define('USEEXISTS',FALSE);//是否使用系统存在的php内置编码转换函数
  10. //其实php内置编码转换函数转换的不够好
  11. class Charset{

  12.         private static $target_lang,$source_lang;
  13.         protected static $string = '';
  14.         protected static $table = NULL;

  15.         /**
  16. * 编码互换   
  17. *   
  18. * @param string $source   
  19. * @param string $source_lang 输入编码 'utf-8' or 'gb2312' or 'big5'   
  20. * @param string $target_lang 输出编码 'utf-8' or 'gb2312' or 'big5'   
  21. * @return string   
  22. */   
  23.         static public function convert($source,$source_lang,$target_lang='utf-8'){
  24.                 if($source_lang != ''){
  25.                         $source_lang = str_replace(
  26.                         array('gbk','utf8','big-5'),
  27.                         array('gb2312','utf-8','big5'),
  28.                         strtolower($source_lang)
  29.                         );
  30.                 }
  31.                 if($target_lang != ''){
  32.                         $target_lang = str_replace(
  33.                         array('gbk','utf8','big-5'),
  34.                         array('gb2312','utf-8','big5'),
  35.                         strtolower($target_lang)
  36.                         );
  37.                 }
  38.                 if($source_lang == $target_lang||$source == ''){
  39.                         return $source;
  40.                 }
  41.                 $index = $source_lang."_".$target_lang;
  42.                 if(USEEXISTS&&!in_array($index,array('gb2312_big5','big5_gb2312'))){//繁简互换并不是交换字符集编码
  43.                         if(function_exists('iconv')){
  44.                                 return iconv($source_lang,$target_lang,$source);
  45.                         }
  46.                         if(function_exists('mb_convert_encoding')){
  47.                                 return mb_convert_encoding($source,$target_lang,$source_lang);
  48.                         }
  49.                 }
  50.                 $table = self::loadtable($index);
  51.                 if(!$table){
  52.                         return $source;
  53.                 }
  54.                 self::$string = $source;
  55.                 self::$source_lang = $source_lang;
  56.                 self::$target_lang = $target_lang;
  57.                 if($source_lang=='gb2312'||$source_lang=='big5'){
  58.                         if($target_lang=='utf-8'){
  59.                                 self::$table = $table;
  60.                                 return self::CHS2UTF8();
  61.                         }
  62.                         if($target_lang=='gb2312'){
  63.                                 self::$table = array_flip($table);
  64.                         }else{
  65.                                 self::$table = $table;
  66.                         }
  67.                         return self::BIG2GB();
  68.                 }elseif(self::$source_lang=='utf-8'){
  69.                         self::$table = array_flip($table);
  70.                         return self::UTF82CHS();
  71.                 }
  72.                 return NULL;
  73.         }


  74.         /**
  75. * js 中的unescape功能   
  76. *   
  77. * @param string $str       源字符串   
  78. * @param string $charset   目标字符串编码 'utf-8' or 'gb2312' or 'big5'   
  79. * @return string   
  80. */   
  81.         static public function unescape($str,$charset='utf-8'){
  82.                 $charset = strtolower($charset);
  83.                 self::$target_lang = str_replace(
  84.                 array('gbk','utf8','big-5'),
  85.                 array('gb2312','utf-8','big5'),
  86.                 $charset
  87.                 );
  88.                 if(self::$target_lang!='utf-8'&&
  89.                 !(USEEXISTS&&(function_exists('mb_convert_encoding')||function_exists('iconv')))
  90.                 ){
  91.                         self::$table = array_flip(self::loadtable('unescapeto'.$charset));
  92.                 }
  93.                 return preg_replace_callback('/[\\\\|%]u(\w{4})/iU',array('Charset','descape'),$str);
  94.         }



  95.         /**
  96. * js 中的escape功能   
  97. *   
  98. * @param string $str       源字符串   
  99. * @param string $charset   源字符串编码 'utf-8' or 'gb2312' or 'big5'   
  100. * @return string   
  101. */   
  102.         static public function escape($str,$charset='utf-8'){
  103.                 $escaped = '';
  104.                 $charset = strtolower($charset);
  105.                 $charset = str_replace(
  106.                 array('gbk','big-5','utf8'),
  107.                 array('gb2312','big5','utf-8'),
  108.                 $charset
  109.                 );
  110.                 $ulen = strlen($str);
  111.                 if($charset!='utf-8'){
  112.                         $table = self::loadtable($charset.'escape');
  113.                         for($i=0;$i<$ulen;$i++){
  114.                                 $c = $str[$i];
  115.                                 if(ord($c)>0x80){
  116.                                         $bin = $c.$str[$i+1];
  117.                                         $i += 1;
  118.                                         $escaped .= sprintf('\u%04X',$table[hexdec(bin2hex($bin))]);
  119.                                         // bin2hex 返回的是string 必须再转化
  120.                                 }else{
  121.                                         $escaped .= $c;
  122.                                 }
  123.                         }
  124.                         return $escaped;
  125.                 }else{
  126.                         for($i=0;$i<$ulen;$i++){
  127.                                 $c = $str[$i];
  128.                                 $char = ord($c);
  129.                                 switch ($char>>4){
  130.                                         case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
  131.                                                 $escaped .= $c;
  132.                                                 break;
  133.                                         case 12: case 13:
  134.                                                 $char = ((($char&0x1F)<<6)|(ord($str[++$i])&0x3F));
  135.                                                 $escaped .= sprintf('\u%04X',$char);
  136.                                                 break;
  137.                                         case 14:
  138.                                                 $char = ((($char&0x0F)<<12)|((ord($str[++$i])&0x3F)<<6)|(ord($str[++$i])&0x3F));
  139.                                                 $escaped .= sprintf('\u%04X',$char);
  140.                                                 break;
  141.                                         default:$escaped .= $c;break;
  142.                                 }
  143.                                 /*$cb = decbin(ord($c));
  144.                                 if(strlen($cb)==8){
  145.                                 $csize = strpos(decbin(ord($cb)),"0");
  146.                                 for($j=0;$j < $csize;$j++){
  147.                                 $i++;
  148.                                 $c .= $str[$i];
  149.                                 }
  150.                                 $escaped .= sprintf('\u%04X',self::utf82u($c));
  151.                                 }else{
  152.                                 $escaped .= $c;
  153.                                 }*/
  154.                         }
  155.                         return $escaped;
  156.                 }
  157.         }


  158.         /**
  159. * json_decode   
  160. *   
  161. * @param string $encoded   源字符串   
  162. * @param string $charset   目标字符串编码 'utf-8' or 'gb2312' or 'big5'   
  163. * @return string/array/boolean/null   
  164. */     
  165.         static public function jsondecode($encoded,$charset='utf-8'){
  166.                 $encoded = preg_replace('/([\t\b\f\n\r ])*/s','',$encoded);//eat whitespace
  167.                 self::$target_lang = $charset;
  168.                 $c = self::cursor($encoded);
  169.                 switch($c){
  170.                         case '{':return self::parseArray($encoded);
  171.                         case '[':return self::parseArray($encoded,FALSE);
  172.                         case '"':return self::string_find($encoded);
  173.                         case 't':return TRUE;
  174.                         case 'f':return FALSE;
  175.                         case 'n':return NULL;
  176.                         default:return self::num_read($c.$encoded);
  177.                 }
  178.         }

  179.         /**
  180. * json_encode   
  181. *   
  182. * @param mixvar $var       多类型变量   
  183. * @param string $charset   默认'utf-8'源变量中字符编码 'utf-8' or 'gb2312' or 'big5'   
  184. * @return string   
  185. */   
  186.         static public function jsonencode($var,$charset=NULL){
  187.                 if(is_null($charset)){
  188.                         $charset = self::$source_lang;
  189.                 }else{
  190.                         self::$source_lang = $charset;
  191.                 }
  192.                 if(!$charset){
  193.                         $charset = 'utf-8';
  194.                 }
  195.                 switch (gettype($var)){
  196.                         case 'boolean':
  197.                                 return $var ? 'true' : 'false';
  198.                         case 'NULL':
  199.                                 return 'null';
  200.                         case 'integer':
  201.                                 return (int) $var;
  202.                         case 'double':
  203.                         case 'float':
  204.                                 return (float) $var;
  205.                         case 'string':
  206.                                 $var = strtr($var,array("\r" => '\\r',"\n" => '\\n',"\t" => '\\t',"\b" => '\\b',
  207.                                 "\f" => '\\f','\\' => '\\\\','"' => '\"',"\x08" => '\b',"\x0c" => '\f')
  208.                                 );
  209.                                 $var = self::escape($var,$charset);
  210.                                 return '"'.$var.'"';
  211.                         case 'array':
  212.                                 return self::encodearray($var);
  213.                         case 'object':
  214.                                 $var = get_object_vars($var);
  215.                                 return self::encodearray($var);
  216.                         default:return 'null';
  217.                 }
  218.         }
  219. }
  220. ?>
复制代码
使用方法:
Charset::convert(string input,string incharset,string outcharset)

Charset::unescape(string escaped,string outcharset)

Charset::escape(string string,string incharset)

Charset::jsondecode(string encoded,string outcharset)

Charset::jsonencode(mix value,string incharset)

Charset::pinYin(string chinese,string incharset)

返回列表