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


Posted in PHP onAugust 02, 2013

因为自己使用字符编码一般的是utf-8编码,但如果对方的博客使用gb2312编码的话,POST过来就会出现乱码(除非对方POST前先转换编码)。在不能保证对方是否一定使用utf-8编码的情况下,自己做一个编码的检查和转换是很有必要的。

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

如果是文件形式的编码检查,还可以直接check utf-8的BOM信息,关于这方面的东西,大家可以看看TP工具箱的编码转换功能,我在那个AppCodingSwitch类中写了比较详细的注释。

话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。文件的检查与转码

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
        returniconv($encoding, $outEncoding, $string);
}

PHP 相关文章推荐
用PHP函数解决SQL injection
Dec 09 PHP
php file_exists 检查文件或目录是否存在的函数
May 10 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
php判断正常访问和外部访问的示例
Feb 10 PHP
通过curl模拟post和get方式提交的表单类
Apr 23 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
php无序树实现方法
Jul 28 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
php根据命令行参数生成配置文件详解
Mar 15 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
Sep 30 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 #PHP
php实现查询百度google收录情况(示例代码)
Aug 02 #PHP
浅析PHP Socket技术
Aug 02 #PHP
php中如何防止表单的重复提交
Aug 02 #PHP
浅析51个PHP处理字符串的函数
Aug 02 #PHP
php中的常用魔术方法总结
Aug 02 #PHP
深入解析Session是否必须依赖Cookie
Aug 02 #PHP
You might like
php递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
python多重继承实例
2014/10/11 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
设计师大码女装:11 Honoré
2020/05/03 全球购物
商务助理岗位职责
2013/11/13 职场文书
cf战队收人广告词
2014/03/14 职场文书
四年级小学生评语
2014/12/26 职场文书
结婚主持人致辞
2015/07/28 职场文书