关于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制作静态网站的模板框架(二)
Oct 09 PHP
服务器端解压缩zip的脚本
Dec 22 PHP
用PHP实现图象锐化代码
Jun 14 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
PHP 获取MySQL数据库里所有表的实现代码
Jul 13 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
如何用PHP做到页面注册审核
Mar 02 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
Apr 23 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使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
python将数组n等分的实例
2019/12/02 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
2014道德模范事迹材料
2014/02/16 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
房屋出售协议书
2014/04/10 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
信仰观后感
2015/06/03 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
python神经网络编程之手写数字识别
2021/05/08 Python
Python中with上下文管理协议的作用及用法
2022/03/18 Python
详解Python中的for循环
2022/04/30 Python
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers