关于PHP自动判断字符集并转码的详解

yipeiwu_com7年前PHP代码库
原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不 管在何种编码情况下,都是小于128,只占用一个字节(全角除外)。
如果是文件形式的编码检查,还可以直接check utf-8的BOM信息。话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。
复制代码 代码如下:

<?php
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);   
}
?>

相关文章

PHP实现的一致性HASH算法示例

本文实例讲述了PHP实现的一致性HASH算法。分享给大家供大家参考,具体如下: <?php // +----------------------------------...

php遍历数组的方法分享

在PHP中数组分为两类: 数字索引数组和关联数组。 其中数字索引数组和C语言中的数组一样,下标是为0,1,2… 而关联数组下标可能是任意类型,与其它语言中的hash,map等结构相似。...

php小技巧之过滤ascii控制字符

还记得以前在工作中,将爬来的其它网站的数据导到xml。但是会遇到一个问题:即网页会有ascII的控制字符。一开始以为是别人为了防止采集而加入的,然后发现一个就往过滤表里加一个。直到慢慢发...

PHP文件读写操作相关函数总结

PHP文件读写操作相关函数总结

一、fwrite()写入文件 将程序中的数据保存到文件中比较容易,使用fwrite()函数就可以将字符串内容写入文件中。在文件中中通过字符序列\n表示换行符,表示文件中一行的末尾。当需要...

PHP简单日历实现方法

PHP简单日历实现方法

本文实例讲述了PHP简单日历实现方法。分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <?php /* * Created on 2016-7...