终极解决iconv不能转换的问题 php将UTF-8完全转换成GB2312

时间:2010-12-01 16:20 作者:php 点击:
终极解决iconv不能转换的问题 php将UTF-8完全转换成GB2312

  

php将UTF-8完全转换成GB2312,解决iconv不能转换的问题

开始是用 $re =iconv("UTF-8", "GB2312","绿色php资源phpzy.com"); 将utf8转换成gb2312,结果经常出错!到了一半就看不到后文了。后来用 $re =iconv("UTF-8", "GB2312//IGNORE","绿色php资源phpzy.com"); 加上了忽略错误,好了点,可以转换到底了!可是今天又发现,还是有部分网页无法转换。后来仔细研究发现原来 iconv 只能转换3字符的utf8码,如果需要全码转换需要另外写函数。

首先需要了解utf8的构成:

基础:

  1. 单独使用iconv函数只能转换GB2312字符,外文字符无法转换
  2. 没有现成的函数可以用
  3. bindec()函数:将二进制格式的"01"字符串转换为十进制数
  4. decbin()函数:将十进制数转换为二进制字符串,如decbin(224)="11100000"

  思路:因为UTF-8分别有1,2,3字节编码,中日韩文都是3字节编码,处理时根据字符编码中首字节大小区分字节数量。

  1.如首字节小于128,为ASCII码
  2.128~192,非UTF-8编码,且处理为&#ord();
  3. 192~224, 双字节UTF-8编码
  4. 224~240,三字节编码
  5. 240~248,四字节编码
  6. 。。。
  7. 对于三字节编码的尝试用iconv转换成GB2312
  8. 非GB2312的多字节字符,尝试把UTF-8转换成Unicode,再取到Unicode十进制值
  9. 可以考虑使用位运算,也可以用bindec()函数

程序如下:

 

  1. function GetGB2312String($name)  
  2. {  
  3. $tostr = "";  
  4. for($i=0;$i<strlen($name);$i++)  
  5. {  
  6.    $curbin = ord(substr($name,$i,1));  
  7.    if($curbin < 0x80)  
  8.    {  
  9.     $tostr .= substr($name,$i,1);  
  10.    }elseif($curbin < bindec("11000000")){  
  11.     $str = substr($name,$i,1);  
  12.     $tostr .= "&#".ord($str).";";  
  13.    }elseif($curbin < bindec("11100000")){  
  14.     $str = substr($name,$i,2);  
  15.     $tostr .= "&#".GetUnicodeChar($str).";";  
  16.     $i += 1;  
  17.    }elseif($curbin < bindec("11110000")){  
  18.     $str = substr($name,$i,3);  
  19.     $gstr= iconv("UTF-8","GB2312",$str);  
  20.     if(!$gstr)  
  21.     {  
  22.     $tostr .= "&#".GetUnicodeChar($str).";";  
  23.     }else{  
  24.     $tostr .= $gstr;  
  25.     }  
  26.  
  27.     $i += 2;  
  28.    }elseif($curbin < bindec("11111000")){  
  29.     $str = substr($name,$i,4);  
  30.     $tostr .= "&#".GetUnicodeChar($str).";";  
  31.      
  32.     $i += 3;  
  33.    }elseif($curbin < bindec("11111100")){  
  34.     $str = substr($name,$i,5);  
  35.     $tostr .= "&#".GetUnicodeChar($str).";";  
  36.      
  37.     $i += 4;  
  38.    }else{  
  39.     $str = substr($name,$i,6);  
  40.     $tostr .= "&#".GetUnicodeChar($str).";";  
  41.      
  42.     $i += 5;  
  43.    }  
  44. }  
  45.  
  46. return $tostr;  
  47. }//end function  
  48.  
  49. function GetUnicodeChar($str)  
  50. {  
  51. $temp = "";  
  52. for($i=0;$i<strlen($str);$i++)  
  53. {  
  54.    $x = decbin(ord(substr($str,$i,1)));  
  55.    if($i == 0)  
  56.    {  
  57.     $s = strlen($str)+1;  
  58.     $temp .= substr($x,$s,8-$s);  
  59.    }else{  
  60.     $temp .= substr($x,2,6);  
  61.    }  
  62. }  
  63. return bindec($temp);  
  64. }//end function  
  65.  

使用:$re=GetGB2312String("绿色php资源phpzy.com");

经过测试,基本上100% 可以转换成gbk码了。
 


标签(Tag):php将UTF-8完全转换成GB2312
------分隔线----------------------------
推荐内容
热点内容