关于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 相关文章推荐
使用sockets:从新闻组中获取文章(二)
Oct 09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
Jul 18 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
PHP SESSION的增加、删除、修改、查看操作
Mar 20 PHP
简单谈谈PHP vs Node.js
Jul 17 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
详细分析PHP 命名空间(namespace)
Jun 30 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 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入门基础之php代码写法
2011/12/30 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
Python基于execjs运行js过程解析
2020/11/27 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
瀑布模型都有哪些优缺点
2014/06/23 面试题
就业推荐表自我鉴定范文
2014/03/21 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
使用Redis做预定库存缓存功能
2022/04/02 Redis