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


Posted in PHP onJune 26, 2013

原理很简单,因为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 相关文章推荐
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
php一次性删除前台checkbox多选内容的方法
Sep 22 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 PHP
实例介绍PHP的Reflection反射机制
Aug 05 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
如何用PHP做到页面注册审核
Mar 02 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
Oct 03 PHP
PHP中多字节字符串操作实例详解
Aug 23 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
Jun 26 #PHP
php 批量生成html,txt文件的实现代码
Jun 26 #PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 #PHP
解析strtr函数的效率问题
Jun 26 #PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 #PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 #PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 #PHP
You might like
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
php-7.3.6 编译安装过程
2020/02/11 PHP
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
JS实现按钮控制计时开始和停止功能
2017/07/27 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
2019/08/09 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
Python实现屏幕截图的两种方式
2018/02/05 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
实习生自我鉴定范文
2013/12/05 职场文书
先进典型发言材料
2014/12/30 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL