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实现的MySQL数据浏览器
Mar 11 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
PHP中ini_set和ini_get函数的用法小结
Feb 18 PHP
浅析php适配器模式(Adapter)
Nov 25 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 PHP
使用ThinkPHP生成缩略图及显示
Apr 27 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
PHP实现websocket通信的方法示例
Aug 28 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
Sep 10 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出错界面
2006/10/09 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
Node对CommonJS的模块规范
2019/11/06 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
简述Python中的进程、线程、协程
2016/03/18 Python
python多线程同步之文件读写控制
2021/02/25 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
linux面试题参考答案(3)
2012/09/13 面试题
EJB的几种类型
2012/08/15 面试题
小学生综合素质评语
2014/04/23 职场文书
离职保密承诺书
2014/05/28 职场文书
法人授权委托书
2014/09/16 职场文书
中学生自我评价2015
2015/03/03 职场文书
怎样写观后感
2015/06/19 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书