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 相关文章推荐
什么是MVC,好东西啊
May 03 PHP
discuz安全提问算法
Jun 06 PHP
PHP Squid中可缓存的动态网页设计
Sep 17 PHP
php foreach、while性能比较
Oct 15 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
PHP中的替代语法简介
Aug 22 PHP
PHP中__autoload和Smarty冲突的简单解决方法
Apr 08 PHP
Yii调试查看执行SQL语句的方法
Jul 15 PHP
PHP实现百度人脸识别
May 06 PHP
PHP实现简单用户登录界面
Oct 23 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判断类是否存在函数class_exists用法分析
2014/11/14 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
python端口扫描系统实现方法
2014/11/19 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
pybind11在Windows下的使用教程
2019/07/04 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
python如何建立全零数组
2020/07/19 Python
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
Sony C++笔试题
2013/03/10 面试题
护理专科毕业自荐信范文
2014/04/21 职场文书
上甘岭观后感
2015/06/10 职场文书
入学证明
2015/06/23 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python