关于PHP自动判断字符集并转码的详解


Posted in PHP onJune 26, 2013

原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不 管在何种编码情况下,都是小于128,只占用一个字节(全角除外)。
如果是文件形式的编码检查,还可以直接check utf-8的BOM信息。话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。

<?php
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   
        return iconv($encoding,$outEncoding,$string);    
}
?>

PHP 相关文章推荐
PHP 压缩文件夹的类代码
Nov 05 PHP
php file_get_contents函数轻松采集html数据
Apr 22 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
php实现上传图片保存到数据库的方法
Feb 11 PHP
php压缩和解压缩字符串的方法
Mar 14 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 PHP
YII框架http缓存操作示例
Apr 29 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
Jun 26 #PHP
php 批量生成html,txt文件的实现代码
Jun 26 #PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 #PHP
解析strtr函数的效率问题
Jun 26 #PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 #PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 #PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 #PHP
You might like
php实现CSV文件导入和导出
2015/10/24 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
2015/11/03 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
JS验证不重复验证码
2017/02/10 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
python中常用的九种预处理方法分享
2016/09/11 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
python+flask实现API的方法
2018/11/21 Python
Python中print函数简单使用总结
2019/08/05 Python
python制作朋友圈九宫格图片
2019/11/03 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
两年的个人工作自我评价
2014/01/10 职场文书
经营理念口号
2014/06/21 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
军训通讯稿范文
2015/07/18 职场文书
事业单位岗位说明书
2015/10/08 职场文书
2016年敬老月活动总结
2016/04/05 职场文书