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 相关文章推荐
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
Zend的Registry机制的使用说明
May 02 PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP简单遍历对象示例
Sep 28 PHP
基于php判断客户端类型
Oct 14 PHP
PHP 实现公历日期与农历日期的互转换
Sep 13 PHP
PHP实现登录验证码校验功能
May 17 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 09 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
PHP单态模式简单用法示例
2016/11/16 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
javascript multibox 全选
2009/03/22 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
Javascript 遍历对象中的子对象
2009/07/03 Javascript
jQuery 表单验证扩展(三)
2010/10/20 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
layui表格数据重载
2019/07/27 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
Python中的类学习笔记
2014/09/23 Python
python使用tkinter实现简单计算器
2018/01/30 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
高中毕业生自我鉴定
2013/11/03 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
党性心得体会
2014/09/03 职场文书
慰问信范文
2015/02/14 职场文书
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android