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 max_execution_time执行时间问题
Jul 17 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 PHP
PHP 解决session死锁的方法
Jun 20 PHP
php跨域cookie共享使用方法
Feb 20 PHP
php初始化对象和析构函数的简单实例
Mar 11 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
php判断表是否存在的方法
Jun 18 PHP
php5.4传引用时报错问题分析
Jan 22 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
PHP实现简单日历类编写
Aug 28 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-MySQL教程归纳总结
2008/06/07 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
Js面试算法详解
2018/04/08 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
Python牛刀小试密码爆破
2011/02/03 Python
python实现排序算法
2014/02/14 Python
Python判断字符串与大小写转换
2015/06/08 Python
总结Python编程中函数的使用要点
2016/03/20 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
python实现微信自动回复功能
2018/04/11 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
PyTorch中的Variable变量详解
2020/01/07 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
2015年乡镇纪检工作总结
2015/04/22 职场文书
单位工作证明范本
2015/06/15 职场文书
学术研讨会主持词
2015/07/04 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android