Discuz教程网

比较全的PHP编码转换类

[复制链接]
authicon dly 发表于 2011-1-7 14:14:37 | 显示全部楼层 |阅读模式
因为对编码不熟悉,在处理起一些编码问题来,经常搞得抓耳挠腮的,最近在PHPChina中发现了一个高人写的类。可以完成一下转换

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)

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

  12. class Charset{   
  13.       
  14.     private static $target_lang,$source_lang;   
  15.     protected static $string = \'\';   
  16.     protected static $table = NULL;  

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


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

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

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

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

  221. /**  
  222.      * 汉字拼音  
  223.      *  
  224.      * @param string $str  
  225.      * @param string $charset     输入编码 \'utf-8\' or \'gb2312\' or \'big5\'  
  226.      * @return string  
  227.      */  
  228.     static public function PinYin($str,$charset=\'utf-8\'){   
  229.         if($charset!=\'gb2312\'){   
  230.             $str = self::convert($str,$charset,\'gb2312\');   
  231.         }   
  232.         self:table = include(TABLE_DIR.\'./pinyin.php\');   
  233.         $gblen = strlen($str);   
  234.         $pin = \'\';   
  235.         for($i=0;$i<$gblen;$i++){   
  236.             $c = ord($str[$i]);   
  237.             if($c > 0x00A0){   
  238.                 $index = 0x10000-($c*0x0100 + ord($str[++$i]));   
  239.                 $pin .= self::getPinYin($index);   
  240.             }else{   
  241.                 $pin .= $str[$i];   
  242.             }   
  243.         }   
  244.         return trim($pin);   
  245.     }   
  246.     static protected function getPinYin($index){   
  247.         if($index==0x1534) return \'yan\';   
  248.         if($index>0x4F5F||$index<0x2807){   
  249.             return \'\';   
  250.         }   
  251.         if(!self:table){   
  252.             return \'\';   
  253.         }   
  254.         while(true){   
  255.             if(!isset(self:table[$index])){   
  256.                 $index += 1;   
  257.                 if($index > 0x4F5F){   
  258.                     return \'\';   
  259.                 }   
  260.                 continue;   
  261.             }else{   
  262.                 return self:table[$index];   
  263.             }   
  264.         }   
  265.         return \'\';   
  266.     }   
  267.     static protected function loadtable($index){   
  268.         static $table = array();   
  269.         $tabIndex = \'\';   
  270.         switch ($index) {   
  271.             case \'gb2312_utf-8\':   
  272.             case \'utf-8_gb2312\':   
  273.             case \'gb2312escape\':   
  274.             case \'unescapetogb2312\':   
  275.                 $tabIndex = \'gbkutf\';   
  276.                 break;   
  277.             case \'big5_utf-8\':   
  278.             case \'utf-8_big5\':   
  279.             case \'big5escape\':   
  280.             case \'unescapetobig5\':   
  281.                 $tabIndex = \'big5utf\';   
  282.                 break;   
  283.             case \'gb2312_big5\':   
  284.             case \'big5_gb2312\':   
  285.                 $tabIndex = \'gbkbig5\';   
  286.                 break;   
  287.             default:return NULL;   
  288.         }   
  289.         if(!isset($table[$tabIndex])){   
  290.             $table[$tabIndex] = @include(TABLE_DIR."/".$tabIndex.".php");   
  291.         }   
  292.         return $table[$tabIndex];   
  293.     }   
  294.     static protected function descape($str){   
  295.         $dec = hexdec($str[1]);   
  296.         $str = self::u2utf8($dec);   
  297.         if(self:target_lang == \'utf-8\'){   
  298.             return $str;   
  299.         }   
  300.         if(USEEXISTS){   
  301.             if(function_exists(\'iconv\')){   
  302.                 return iconv(\'utf-8\',self:target_lang,$str);   
  303.             }   
  304.             if(function_exists(\'mb_convert_encoding\')){   
  305.                 return mb_convert_encoding($str,self:target_lang,\'utf-8\');   
  306.             }   
  307.         }   
  308.         if(isset(self:table[$dec])){   
  309.             return self::hex2bin(dechex(self:table[$dec]));   
  310.         }else{   
  311.             return "&#".$dec.";";   
  312.         }   
  313.     }   
  314.     static protected function parseArray($str,$index=TRUE){   
  315.         $result = array();   
  316.         $fp = self::array_open($index,$str);//模拟打开目录   
  317.         while($fp){   
  318.             $type = \'\';   
  319.             $key = \'\';   
  320.             $value = self::array_read($fp,$type,$index,$key);//模拟读取目录   
  321.             if($type==\'{\'){   
  322.                 if($index){   
  323.                     $result[$key] = self::parseArray($fp);//递归   
  324.                 }else{   
  325.                     $result[] = self::parseArray($fp);   
  326.                 }   
  327.             }elseif($type==\'[\'){   
  328.                 if($index){   
  329.                     $result[$key] = self::parseArray($fp,FALSE);   
  330.                 }else{   
  331.                     $result[] = self::parseArray($fp,FALSE);   
  332.                 }   
  333.             }else{   
  334.                 if($index){   
  335.                     $result[$key] = $value;   
  336.                 }else{   
  337.                     $result[] = $value;   
  338.                 }   
  339.             }   
  340.         }   
  341.         return $result;   
  342.     }   
  343.     static protected function array_open($index=TRUE,$string){   
  344.         if($index){   
  345.             $end = \'}\';   
  346.             $new = \'{\';   
  347.         }else{   
  348.             $end = \']\';   
  349.             $new = \'[\';   
  350.         }   
  351.         $endpos = self::getpos($string,$end);   
  352.         //用getpos获得$endpos 因为要判断{,},[,]是不是在字符串里面   
  353.         $newpos = self::getpos($string,$new);   
  354.         $fp = \'\';   
  355.         if($endpos===FALSE){   
  356.             return \'null\';   
  357.         }elseif($newpos===FALSE||$newpos>$endpos){   
  358.             $fp = substr($string,0,$endpos);   
  359.             $string = substr($string,$endpos+1);   
  360.             return $fp;   
  361.         }else{// 条件\'if($newpos<$endpos)\'可以不要了 找到与自己匹对结束符   
  362.             $i = 1;   
  363.             while($i){   
  364.                 $endpos = self::getpos($string,$end,$endpos+1);   
  365.                 $newpos = self::getpos($string,$new,$endpos+1);   
  366.                 if($endpos===FALSE){   
  367.                     return \'null\';   
  368.                 }elseif($newpos===FALSE){   
  369.                     $i-=1;   
  370.                     continue;   
  371.                 }elseif($newpos<$endpos){   
  372.                     $i+=1;   
  373.                     continue;   
  374.                 }else{   
  375.                     continue;   
  376.                 }   
  377.             }   
  378.             $fp = substr($string,0,$endpos);   
  379.             $string = substr($string,$endpos+1);   
  380.             return $fp;   
  381.         }   
  382.     }   
  383.     static protected function getpos($string,$sign,$offset=0){   
  384.         /**  
  385.          * 判断是否在字符串里面原理:  
  386.          * 取得$offset到$pos($sign)位置之间字符串中\'"\'个数  
  387.          * 如果为奇数说明在字符串里面 否则在字符串外面  
  388.          */  
  389.         $pos = strpos($string,$sign,$offset);   
  390.         if($pos===FALSE){   
  391.             return FALSE;   
  392.         }   
  393.         $str = substr($string,$offset,$pos-$offset);   
  394.         $arr = array();   
  395.         preg_match_all(\'/"/\',str_replace(\'\\"\',\'\',$str),$arr);   
  396.         $in = count($arr[0])%2;   
  397.         if(!$in){   
  398.             return $pos;   
  399.         }   
  400.         do{   
  401.             $next = strpos($string,$sign,$pos+1);   
  402.             if($next===FALSE){   
  403.                 return FALSE;   
  404.             }   
  405.             $str = substr($string,$pos,$next-$pos);   
  406.             $arr = array();   
  407.             preg_match_all(\'/"/\',str_replace(\'\\"\',\'\',$str),$arr);   
  408.             $in = !(count($arr[0])%2);   
  409.             $pos = $next;   
  410.         }while($in);   
  411.         return $pos;   
  412.     }   
  413.     static protected function array_read($fp,$type,$index=TRUE,$key=null){   
  414.         if($fp[0]==\',\'){   
  415.             self::cursor($fp);//跳过\',\'   
  416.         }   
  417.         if($index){//有索引的数组   
  418.             self::cursor($fp);//跳过 \'"\'合法   
  419.             $key = self::string_find($fp);//读取索引值   
  420.             self::cursor($fp);//跳过\':\'   
  421.         }   
  422.         $c = self::cursor($fp);   
  423.         switch($c){   
  424.             case \'{\':   
  425.                 $type=\'{\';   
  426.                 return NULL;   
  427.             case \'[\':   
  428.                 $type=\'[\';   
  429.                 return NULL;   
  430.             case \'"\':   
  431.                 $rs = self::string_find($fp);   
  432.                 $s = self::cursor($fp);//跳过\',\'or \'}\' or \']\' 要求合法   
  433.                 if(!($s==\',\'||$s==null)){   
  434.                     die(\'parse error1!\');   
  435.                 }   
  436.                 return $rs;   
  437.             case \'t\':   
  438.                 if(self::cursor($fp,3)==\'rue\'){//跳过\'rue\'   
  439.                     $s = self::cursor($fp);//跳过\',\'or \'}\' or \']\' 要求合法   
  440.                     if(!($s==\',\'||$s==null)){   
  441.                         die("parse error$s!");  
  442.                     }  
  443.                     return TRUE;  
  444.                 }else{  
  445.                     die(\'parse error3!\');  
  446.                 }  
  447.             case \'f\':  
  448.                 if(self::cursor($fp,4)==\'alse\'){  
  449.                     $s = self::cursor($fp);//跳过\',\'or \'}\' or \']\' 要求合法  
  450.                     if(!($s==\',\'||$s==null)){  
  451.                         die(\'parse error4!\');  
  452.                     }  
  453.                     return FALSE;  
  454.                 }else{  
  455.                     die(\'parse error5!\');  
  456.                 }  
  457.             case \'n\':  
  458.                 if(self::cursor($fp,3)==\'ull\'){//跳过\'ull\'  
  459.                     $s = self::cursor($fp);//跳过\',\'or \'}\' or \']\' 要求合法  
  460.                     if(!($s==\',\'||$s==null)){  
  461.                         die(\'parse error6!\');  
  462.                     }  
  463.                     return NULL;  
  464.                 }  
  465.             default:  
  466.                 $pos = strpos($fp,\',\');  
  467.                 if($pos===FALSE){  
  468.                     $num = substr($fp,0);  
  469.                     $fp = \'\';  
  470.                 }else{  
  471.                     $num = substr($fp,0,$pos);  
  472.                     $fp = substr($fp,$pos+1);  
  473.                 }  
  474.                 return self::num_read($c.$num);  
  475.         }  
  476.     }  
  477.     static protected function string_find(&$str){  
  478.         $end = strpos($str,\'"\',0);   
  479.         while($str[$end-1]==\'\\\\\'){  
  480.             $end = strpos($str,\'"\',$end+1);  
  481.             if($end===FALSE){  
  482.                 return \'null\';  
  483.             }  
  484.         }  
  485.         $escaped = strtr(  
  486.             rtrim(self::cursor($str,$end+1),\'"\'),  
  487.             array(\'\\\\"\' => \'"\',\'\\\\\\\\\'=> \'\\\\\',\'\\\\/\'=> \'/\',\'\\\\b\' => chr(8),  
  488.                 \'\\\\f\'=>chr(12),\'\\\\n\'=>chr(10),\'\\\\r\'=> chr(13),  
  489.                 \'\\\\t\'=>chr(9),\'\\\\u\'=>\'%u\'  
  490.             )  
  491.         );  
  492.         return self::unescape($escaped,self:target_lang);  
  493.     }  
  494.     static protected function num_read($str){  
  495.         $matches = array();  
  496.         if (preg_match(\'/-?([0-9])*(\\.[0-9]*)?((e|E)((-|\\+)?)[0-9]+)?/s\',$str,$matches)){  
  497.             $num = $matches[0];  
  498.             $val   = intval($num);  
  499.             $fval  = floatval($num);  
  500.             $value = $val?$valfval;  
  501.             return $value;  
  502.         }else{  
  503.             return NULL;  
  504.         }  
  505.     }  
  506.     static protected function cursor(&$str,$shift=1){  
  507.         $get = substr($str,0,$shift);  
  508.         $str = substr($str,$shift);  
  509.         return $get;  
  510.     }  
  511.     static protected function encodearray($array){  
  512.         if(!$array){  
  513.             return \'null\';  
  514.         }  
  515.         if((array_keys($array)!==range(0,sizeof($array)- 1))){  
  516.             $rs = \'\';  
  517.             foreach($array as $key=>$value){  
  518.                 $rs .= \',\'.self::jsonencode(strval($key)).\':\';  
  519.                 if(is_array($value)){  
  520.                     $rs .= self::encodearray($value);  
  521.                 }else{  
  522.                     $rs .= self::jsonencode($value);  
  523.                 }  
  524.             }  
  525.             $rs = \'{\'.ltrim($rs,\',\').\'}\';  
  526.             return $rs;  
  527.         }else{  
  528.             $rs = \'\';  
  529.             foreach($array as $value){  
  530.                 if(is_array($value)){  
  531.                     $rs .= \',\'.self::encodearray($value);  
  532.                 }else{  
  533.                     $rs .= \',\'.self::jsonencode($value);  
  534.                 }  
  535.             }  
  536.             $rs = \'[\'.ltrim($rs,\',\').\']\';  
  537.             return $rs;  
  538.         }  
  539.     }  
  540.     static protected function CHS2UTF8(){  
  541.         $utf8 = "";  
  542.         while(self:string){  
  543.             if (ord(self:string[0]) > 0x80){  
  544.                 $bin = substr(self:string,0,2);  
  545.                 $utf8 .= self::u2utf8(self:table[hexdec(bin2hex($bin))]);  
  546.                 self:string = substr(self:string,2);  
  547.             }else{  
  548.                 $utf8 .= self:string[0];  
  549.                 self:string = substr(self:string,1);  
  550.             }  
  551.         }  
  552.         return $utf8;  
  553.     }  
  554.     static protected function UTF82CHS(){  
  555.         $chs  = "";  
  556.         $ulen = strlen(self:string);  
  557.         for($i=0;$i<$ulen;$i++){  
  558.             $c = self:string[$i];  
  559.             $char = ord($c);  
  560.             switch ($char>>4){  
  561.                 case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:  
  562.                     $chs .= $c;  
  563.                     break;  
  564.                 case 12: case 13:  
  565.                     $char = self:table[(($char&0x1F)<<6)|(ord(self:string[++$i])&0x3F)];  
  566.                     $chs .= self::hex2bin(dechex($char));  
  567.                     break;  
  568.                 case 14:  
  569.                     $char = self:table[  
  570.                         (($char&0x0F)<<12)  
  571.                         |((ord(self:string[++$i])&0x3F)<<6)  
  572.                         |(ord(self:string[++$i])& 0x3F)  
  573.                     ];  
  574.                     $chs .= self::hex2bin(dechex($char));  
  575.                     break;  
  576.                 defaultchs .= $c;break;  
  577.             }  
  578.         }  
  579.         /*for($i=0;$i<$ulen;$i++){  
  580.             $c = self:string[$i];  
  581.             $cb = decbin(ord($c));  
  582.             if(strlen($cb)==8){  
  583.                 $csize = strpos(decbin(ord($cb)),"0");  
  584.                 for($j=0;$j < $csize;$j++){  
  585.                     $i++;  
  586.                     $c .= self:string[$i];  
  587.                 }  
  588.                 $c = self::utf82u($c);  
  589.                 if(isset(self:table[$c])){  
  590.                     $chs .= self::hex2bin(dechex(self:table[$c]));  
  591.                 }else{   
  592.                     $chs .= "&#".$c.";";  
  593.                 }  
  594.             }else{  
  595.                 $chs .= $c;  
  596.             }  
  597.         }*/  
  598.         return trim($chs);  
  599.     }  
  600.     static protected function BIG2GB(){  
  601.         $ret = \'\';  
  602.         while(self:string){  
  603.             if(ord(self:string[0]) > 0x80){  
  604.                 $index = hexdec(bin2hex(self:string[0].self:string[1]));  
  605.                 $value = self:table[$index];  
  606.                 $ret .= self::hex2bin(dechex($value));  
  607.                 self:string = substr(self:string,2);  
  608.             }else{  
  609.                 $ret .= self:string[0];  
  610.                 self:string = substr(self:string,1);  
  611.             }  
  612.         }  
  613.         return $ret;  
  614.     }  
  615.     static protected function u2utf8($c){  
  616.         $str = \'\';  
  617.         if ($c < 0x80){  
  618.             $str.= chr($c);  
  619.         }elseif($c < 0x800){  
  620.             $str.= chr(0xC0 | $c>>6);  
  621.             $str.= chr(0x80 | $c & 0x3F);  
  622.         }elseif($c < 0x10000){  
  623.             $str.= chr(0xE0 | $c>>12);  
  624.             $str.= chr(0x80 | $c>>6 & 0x3F);  
  625.             $str.= chr(0x80 | $c & 0x3F);  
  626.         }elseif($c < 0x200000){  
  627.             $str.= chr(0xF0 | $c>>18);  
  628.             $str.= chr(0x80 | $c>>12 & 0x3F);  
  629.             $str.= chr(0x80 | $c>>6 & 0x3F);  
  630.             $str.= chr(0x80 | $c & 0x3F);  
  631.         }  
  632.         return $str;  
  633.     }  
  634.     static protected function utf82u($c){  
  635.         switch(strlen($c)) {  
  636.             case 1:  
  637.                 return ord($c);  
  638.                 break;  
  639.             case 2:  
  640.                 $n  = (ord($c[0]) & 0x3f) << 6;  
  641.                 $n += ord($c[1]) & 0x3f;  
  642.                 return $n;  
  643.                 break;  
  644.             case 3:  
  645.                 $n  = (ord($c[0]) & 0x1f) << 12;  
  646.                 $n += (ord($c[1]) & 0x3f) << 6;  
  647.                 $n += ord($c[2]) & 0x3f;  
  648.                 return $n;  
  649.                 break;  
  650.             case 4:  
  651.                 $n  = (ord($c[0]) & 0x0f) << 18;  
  652.                 $n += (ord($c[1]) & 0x3f) << 12;  
  653.                 $n += (ord($c[2]) & 0x3f) << 6;  
  654.                 $n += ord($c[3]) & 0x3f;  
  655.                 return $n;  
  656.                 break;  
  657.             default:return \'\';break;  
  658.         }  
  659.     }  
  660.     static protected function hex2bin($hexdata){  
  661.         $bindata = \'\';   
  662.         for ($i = 0, $count = strlen($hexdata); $i < $count; $i += 2){   
  663.             $bindata .= chr(hexdec($hexdata[$i].$hexdata[$i + 1]));   
  664.         }   
  665.         return $bindata;   
  666.     }   
  667. }  
  668. ?>
复制代码







上一篇:PHP缓存类PHP-Cache-Kit
下一篇:PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数
authicon 婷婷爱牛牛 发表于 2011-6-17 08:00:52 | 显示全部楼层
顶的就是你
authicon 福倒菜菜子 发表于 2011-6-21 12:59:40 | 显示全部楼层
回贴下载呀
authicon nmzc 发表于 2011-6-23 05:59:34 | 显示全部楼层
谢谢,学习了
authicon rin421 发表于 2011-6-25 05:59:59 | 显示全部楼层
很好 很强大。。谢谢分享
authicon qqoxygen 发表于 2011-8-10 02:00:12 | 显示全部楼层
支持!好东西,拿走了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 14:37

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表