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发电子邮件
Oct 09 PHP
php中的观察者模式
Mar 24 PHP
php XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
PHP之APC缓存详细介绍 apc模块安装
Jan 13 PHP
php过滤表单提交的html等危险代码
Nov 03 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
PHP读取文件内容的五种方式
Dec 28 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 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下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
php json_encode值中大括号与花括号区别
2013/09/30 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
JavaScript字符串对象
2017/01/14 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
python如何实现异步调用函数执行
2019/07/08 Python
python音频处理的示例详解
2020/12/23 Python
Python的logging模块基本用法
2020/12/24 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
英国在线药房:Express Chemist
2019/03/28 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
z-index不起作用
2021/03/31 HTML / CSS
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers