加入收藏 | 设为首页 | 会员中心 | 我要投稿 广州站长网 (https://www.020zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-01-22 04:43:53 所属栏目:PHP教程 来源:互联网
导读:原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围,而英文不管在何种编码情况下,都是小于128,只占用一个字节,全角除外. 在PHP处理页面的时候,我们对于字符集的转换都是采用了iconv或者mb_c
  原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围,而英文不管在何种编码情况下,都是小于128,只占用一个字节,全角除外.
 
  在PHP处理页面的时候,我们对于字符集的转换都是采用了iconv或者mb_convert等函数,但这其实是有一个前提的,即我们事先得知道in和out是什么样的编码,我们才能进行正确的转换.
 
  下面这个函数,就可以在不知道源字符串编码的情况下,自动判断其编码并进行转换,虽然只支持UTF8编码和GB2312编码,但对于国内绝大多数网站来说,已经够用了,代码如下:
 
  function safeEncoding($string,$outEncoding = 'UTF-8')
  {
      $encoding = "UTF-8";
      for($i=0;$i<128)
              continue;
  
          if((ord($string{$i})&224)==224)
          {
              //第一个字节判断通过
              $char = $string{++$i};
              if((ord($char)&128)==128)
              {
                  //第二个字节判断通过
                  $char = $string{++$i};
                  if((ord($char)&128)==128)
                  {
                      $encoding = "UTF-8";
                      break;
                  }
              }
          }
          if((ord($string{$i})&192)==192)
          {
              //第一个字节判断通过
              $char = $string{++$i};
              if((ord($char)&128)==128)
              {
                  //第二个字节判断通过
                  $encoding = "GB2312";
                  break;
              }
          }
      }
  
      if(strtoupper($encoding) == strtoupper($outEncoding))
          return $string;
      else
          return iconv($encoding,$outEncoding,$string);
  }
  识别汉字编码,因为YBlog用的是utf-8,如果引用通告发过来的是gb2312的编码的话,需要可以识别并完成编码转换,代码如下:
 
  function safeEncoding($string,$outEncoding = 'UTF-8')   
  {   
      $encoding = "UTF-8";   
      for($i=0;$i<strlen($string);$i++)   
      {   
          if(ord($string{$i})<128)   
              continue;   
    
          if((ord($string{$i})&224)==224)   
          {   
              //第一个字节判断通过   
              $char = $string{++$i};   
              if((ord($char)&128)==128)   
              {   
                  //第二个字节判断通过   
                  $char = $string{++$i};   
                  if((ord($char)&128)==128)   
                  {   
                      $encoding = "UTF-8";   
                      break;   
                  }   
              }   
          }   
          if((ord($string{$i})&192)==192)   
          {   
              //第一个字节判断通过   
              $char = $string{++$i};   
              if((ord($char)&128)==128)   
              {   
                  //第二个字节判断通过   
                  $encoding = "GB2312";   
                  break;   
              }   
          }   
      }   
         
      if(strtoupper($encoding) == strtoupper($outEncoding))   
          return $string;   
      else  
          return iconv($encoding,$outEncoding,$string);   
  } 

(编辑:广州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读