当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP自动识别字符集编码并完成转码

发布:smiling 来源: PHP粉丝网  添加日期:2014-07-04 09:40:04 浏览: 评论:0 

原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围,而英文不管在何种编码情况下,都是小于128,只占用一个字节,全角除外.

在PHP处理页面的时候,我们对于字符集的转换都是采用了iconv或者mb_convert等函数,但这其实是有一个前提的,即我们事先得知道in和out是什么样的编码,我们才能进行正确的转换.

下面这个函数,就可以在不知道源字符串编码的情况下,自动判断其编码并进行转换,虽然只支持UTF8编码和GB2312编码,但对于国内绝大多数网站来说,已经够用了,代码如下:

  1. function safeEncoding($string,$outEncoding = 'UTF-8'
  2.     $encoding = "UTF-8"
  3.     for($i=0;$i<128) 
  4.             continue
  5.  
  6.         if((ord($string{$i})&224)==224) 
  7.         { 
  8.             //第一个字节判断通过 
  9.             $char = $string{++$i}; 
  10.             if((ord($char)&128)==128) 
  11.             { 
  12.                 //第二个字节判断通过 
  13.                 $char = $string{++$i}; 
  14.                 if((ord($char)&128)==128) 
  15.                 { 
  16.                     $encoding = "UTF-8"
  17.                     break
  18.                 } 
  19.             } 
  20.         } 
  21.         if((ord($string{$i})&192)==192) 
  22.         { 
  23.             //第一个字节判断通过 
  24.             $char = $string{++$i}; 
  25.             if((ord($char)&128)==128) 
  26.             { 
  27.                 //第二个字节判断通过 
  28.                 $encoding = "GB2312"
  29.                 break
  30.             } 
  31.         } 
  32.     } 
  33.  
  34.     if(strtoupper($encoding) == strtoupper($outEncoding)) 
  35.         return $string
  36.     else 
  37.         return iconv($encoding,$outEncoding,$string); 

识别汉字编码,因为YBlog用的是utf-8,如果引用通告发过来的是gb2312的编码的话,需要可以识别并完成编码转换,代码如下:

  1. function safeEncoding($string,$outEncoding = 'UTF-8')   
  2. {   
  3.     $encoding = "UTF-8";   
  4.     for($i=0;$i<strlen($string);$i++)   
  5.     {   
  6.         if(ord($string{$i})<128)   
  7.             continue;   
  8.   
  9.         if((ord($string{$i})&224)==224)   
  10.         {   
  11.             //第一个字节判断通过   
  12.             $char = $string{++$i};   
  13.             if((ord($char)&128)==128)   
  14.             {   
  15.                 //第二个字节判断通过   
  16.                 $char = $string{++$i};   
  17.                 if((ord($char)&128)==128)   
  18.                 {   
  19.                     $encoding = "UTF-8";   
  20.                     break;   
  21.                 }   
  22.             }   
  23.         }   
  24.         if((ord($string{$i})&192)==192)   
  25.         {   
  26.             //第一个字节判断通过   
  27.             $char = $string{++$i};   
  28.             if((ord($char)&128)==128)   
  29.             {   
  30.                 //第二个字节判断通过   
  31.                 $encoding = "GB2312";   
  32.                 break;   
  33.             }   
  34.         }   
  35.     }   
  36.        
  37.     if(strtoupper($encoding) == strtoupper($outEncoding))   
  38.         return $string;   
  39.     else  
  40.         return iconv($encoding,$outEncoding,$string);   

Tags: 字符集 自动识别 编码

分享到: