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&amp;MYSQL留言板源码
Jul 19 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 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
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
php 运行效率总结(提示程序速度)
2009/11/26 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
关于Java String的一道面试题
2013/09/29 面试题
华为python面试题
2016/05/03 面试题
应届生的求职推荐信范文
2013/11/30 职场文书
领导证婚人证婚词
2014/01/13 职场文书
产品促销活动策划书
2014/01/15 职场文书
草船借箭教学反思
2014/02/03 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
普通话宣传标语
2014/06/26 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
假期安全教育广播稿
2014/10/04 职场文书
企业计划生育责任书
2015/05/09 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
民主生活会意见
2015/06/05 职场文书
电视新闻稿
2015/07/17 职场文书
2016年党员承诺书范文
2016/03/24 职场文书