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 相关文章推荐
php5.3 废弃函数小结
May 16 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
PHP操作XML作为数据库的类
Dec 19 PHP
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
php 数组随机取值的简单实例
May 23 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 PHP
PHP递归的三种常用方式
Feb 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
人族 Terran 基本策略
2020/03/14 星际争霸
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
拖动时防止选中
2017/02/03 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
跟老齐学Python之永远强大的函数
2014/09/14 Python
Python查找相似单词的方法
2015/03/05 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python内置模块logging用法实例分析
2018/02/12 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
白色公司:The White Company
2017/10/11 全球购物
部队党性分析材料
2014/02/16 职场文书
家长写给孩子的评语
2014/04/18 职场文书
餐厅筹备计划书
2014/04/25 职场文书
李敖北大演讲稿
2014/05/24 职场文书
上下班时间调整通知
2015/04/23 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
创业计划书之家教中心
2019/09/25 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
粗暴解决CUDA out of memory的问题
2021/05/22 Python
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android