关于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 相关文章推荐
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
PHP编译安装中遇到的两个错误和解决方法
Aug 20 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
Aug 20 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
php从字符串创建函数的方法
Mar 16 PHP
PHP中的traits简单使用实例
May 13 PHP
PHP通过API获取手机号码归属地
May 28 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
cakephp常见知识点汇总
Feb 24 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
php实现session共享的实例方法
Sep 19 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
Oct 01 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执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
python3中str(字符串)的使用教程
2017/03/23 Python
详解Python自建logging模块
2018/01/29 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python虚拟环境venv用法详解
2020/05/25 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
《锄禾》教学反思
2014/04/08 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
小学班主任评语
2014/12/29 职场文书
小班上学期个人总结
2015/02/12 职场文书
大班上学期个人总结
2015/02/13 职场文书
安全守法证明
2015/06/23 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
修辞手法有哪些?
2019/08/29 职场文书
OpenCV实现常见的四种图像几何变换
2022/04/01 Python