关于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 相关文章推荐
教你如何把一篇文章按要求分段
Oct 09 PHP
php_xmlhttp 乱码问题解决方法
Aug 07 PHP
php 上一篇,下一篇文章实现代码与原理说明
May 09 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
Oct 29 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
php将远程图片保存到本地服务器的实现代码
Aug 03 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
Oct 10 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
May 15 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获取用户浏览器版本的方法
2015/01/03 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
ES6 十大特性简介
2020/12/09 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
python检索特定内容的文本文件实例
2018/06/05 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
护理人员的自我评价分享
2014/03/15 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
班级出游活动计划书
2014/08/15 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS