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 24 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
Mar 01 PHP
Smarty的配置与高级缓存技术分享
Jun 05 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
php可生成缩略图的文件上传类实例
Dec 17 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
Feb 08 PHP
php接口技术实例详解
Dec 07 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 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 file_get_contents 函数超时的几种解决方法
2009/07/30 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
小程序hover-class点击态效果实现
2019/02/26 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
解决DataFrame排序sort的问题
2018/06/07 Python
python清除函数占用的内存方法
2018/06/25 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
python绘制多个子图的实例
2019/07/07 Python
python数据爬下来保存的位置
2020/02/17 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
批评与自我批评材料
2014/02/15 职场文书
商务考察邀请函模板
2015/02/02 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS