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无法访问远程mysql的问题分析及解决
May 16 PHP
如何设置mysql允许外网访问
Jun 04 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
php的一个简单加密解密代码
Jan 14 PHP
PHP数组排序之sort、asort与ksort用法实例
Sep 08 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
教你php如何实现验证码
Jan 20 PHP
Smarty分页实现方法完整实例
May 11 PHP
PHP基于GD库的图像处理方法小结
Sep 27 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
零基础php编程好学吗
Oct 11 PHP
php适配器模式简单应用示例
Oct 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统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
JavaScript Date对象使用总结
2009/05/14 Javascript
Javascript Math对象
2009/08/13 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
python使用socket远程连接错误处理方法
2015/04/29 Python
Python3如何解决字符编码问题详解
2017/04/23 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
投诉信格式范文
2015/07/02 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
Java完整实现记事本代码
2022/06/16 Java/Android