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 相关文章推荐
简单采集了yahoo的一些数据
Feb 14 PHP
Snoopy类使用小例子
Apr 15 PHP
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 PHP
php csv操作类代码
Dec 14 PHP
PHP中的按位与和按位或操作示例
Jan 27 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
phpmyadmin中禁止外网使用的方法
Nov 04 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 PHP
PHP微信网页授权的配置文件操作分析
May 29 PHP
PHP中isset、empty的用法与区别示例详解
Nov 05 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常用数学函数汇总
2014/11/21 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
对联广告js flash激活
2006/10/19 Javascript
JavaScript Archive Network 集合
2007/05/12 Javascript
学习ExtJS form布局
2009/10/08 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
详解javascript遍历方式
2015/11/11 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
Python yield 使用方法浅析
2017/05/20 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
kali中python版本的切换方法
2019/07/11 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
python如何处理程序无法打开
2020/06/16 Python
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
世界经理人咨询有限公司面试
2014/09/23 面试题
财务管理个人自荐书范文
2013/11/24 职场文书
单位创先争优活动方案
2014/01/26 职场文书
实习公司领导推荐函
2014/05/21 职场文书
新法人代表任命书
2014/06/06 职场文书
联谊活动总结
2014/08/28 职场文书
匿名检举信范文
2015/03/02 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android