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 求质素(素数) 的实现代码
Apr 12 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
Dec 19 PHP
浅谈PHP强制类型转换,慎用!
Jun 06 PHP
深入理解curl类,可用于模拟get,post和curl下载
Jun 08 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
Yii使用smsto短信接口的函数demo示例
Jul 13 PHP
基于PHPexecl类生成复杂的报表表头示例
Oct 14 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 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
星际争霸中的热键
2020/03/04 星际争霸
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
脚本收藏iframe
2006/07/21 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
使用tensorflow实现线性回归
2018/09/08 Python
pandas通过loc生成新的列方法
2018/11/28 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
python如何将图片转换素描画
2020/09/08 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
初入社会应届生求职信
2013/11/18 职场文书
一年级数学教学反思
2014/02/01 职场文书
2014年创先争优工作总结
2014/12/11 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书