关于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 相关文章推荐
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
May 03 PHP
PHP STRING 陷阱原理说明
Jul 24 PHP
php连接mssql的一些相关经验及注意事项
Feb 05 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
Feb 14 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
php获取一定范围内取N个不重复的随机数
May 28 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
Sep 11 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
Jun 07 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 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 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
小议Javascript中的this指针
2010/03/18 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
JS分页效果示例
2013/10/11 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
JS实现吸顶特效
2020/01/08 Javascript
python中循环语句while用法实例
2015/05/16 Python
Python 递归函数详解及实例
2016/12/27 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
英国领先的游戏零售商:GAME
2019/09/24 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
销售员自我评价怎么写
2013/09/19 职场文书
初级会计求职信范文
2014/02/15 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
校园广播站开场白
2015/06/01 职场文书
公司开业主持词
2015/07/02 职场文书