PHP编码转换函数 自动转换字符集支持数组转换


Posted in PHP onDecember 16, 2012
// 自动转换字符集 支持数组转换 
function auto_charset($fContents, $from='gbk', $to='utf-8') { 
$from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from; 
$to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to; 
if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) { 
//如果编码相同或者非字符串标量则不转换 
return $fContents; 
} 
if (is_string($fContents)) { 
if (function_exists('mb_convert_encoding')) { 
return mb_convert_encoding($fContents, $to, $from); 
} elseif (function_exists('iconv')) { 
return iconv($from, $to, $fContents); 
} else { 
return $fContents; 
} 
} elseif (is_array($fContents)) { 
foreach ($fContents as $key => $val) { 
$_key = auto_charset($key, $from, $to); 
$fContents[$_key] = auto_charset($val, $from, $to); 
if ($key != $_key) 
unset($fContents[$key]); 
} 
return $fContents; 
} 
else { 
return $fContents; 
} 
}

当我们在接受未知客户端提交的数据,由于各客户端的编码不统一,但在我们的服务器端最终只能以一种编码方式来处理,这种情况下就会涉及到一个将接受到的字符转换为特定编码的问题。
这时可能会想到直接用iconv来进行转码,但我们知道,iconv这个函数需要提供的两个参数为输入编码和输出编码,而我们现在根本不知道接受的字符串是什么编码,如果这个时候能得到接收字符是什么编码就好了。
对于这样的问题,一般会有两种解决方案。

方案一
要客户端提交数据时,指定所提交的编码,这时就需要多给一个用来指定编码的变量。
$string = $_GET['charset'] === 'gbk' ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
对于这种情况,如果在没有约定或者我们不能控制客户端的情况下,似乎这种方案使用不是很好。

方案二
直接由服务器端来检测所接收的数据编码。
这种方案当然是最理想了的了,现在问题是怎么检测一个字符的编码吗?对于这种情况,在php里,mb_string这个扩展中的mb_check_encoding提供了我们所需要的功能。
$str = mb_check_encoding($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
但这需要打开mb_string这个扩展,有些时候可能我们的生产服务器中没有打开这个扩展。对于这种情况,需要自己借助如下函数来判断编码。
以下函数非本人所写

function isGb2312($string) { 
for($i=0; $i 127) { 
if( ($v >= 228) && ($v < = 233) ) 
{ 
if( ($i+2) >= (strlen($string) - 1)) return true; 
$v1 = ord( $string[$i+1] ); 
$v2 = ord( $string[$i+2] ); 
if( ($v1 >= 128) && ($v1 < =191) && ($v2 >=128) && ($v2 < = 191) ) 
return false; 
else 
return true; 
} 
} 
} 
return true; 
} 
function isUtf8($string) { 
return preg_match('%^(?: 
[\x09\x0A\x0D\x20-\x7E] # ASCII 
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte 
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs 
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates 
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 
)*$%xs', $string); 
}

这里我们就可以使以上任何一个函数来实现编码的检测。并将其转换成指定的编码。
$str = isGb2312($_GET['str'],'gbk') ? iconv('gbk','utf-8',$_GET['str']) : $_GET['str'];
PHP 相关文章推荐
php 全文搜索和替换的实现代码
Jul 29 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
Nov 12 PHP
php实现文件下载(支持中文文名)
Dec 04 PHP
php统计文章排行示例
Mar 04 PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 PHP
php邮件发送的两种方式
Apr 28 PHP
php实现处理输入转义字符的代码
Nov 08 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP观察者模式定义与用法实例分析
Mar 22 PHP
关于laravel框架中的常用目录路径函数
Oct 23 PHP
PHP代码加密的方法总结
Mar 13 PHP
基于php伪静态的实现方法解析
Jul 31 PHP
PHP获取http请求的头信息实现步骤
Dec 16 #PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 #PHP
mysql 查询指定日期时间内sql语句实现原理与代码
Dec 16 #PHP
非常精妙的PHP递归调用与静态变量使用
Dec 16 #PHP
PHP--用万网的接口实现域名查询功能
Dec 13 #PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 #PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 #PHP
You might like
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
php中文本操作的类
2007/03/17 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
js option删除代码集合
2008/11/12 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
谈谈JS中的!!
2017/12/07 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
vue实现购物车加减
2020/05/30 Javascript
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
python学生管理系统学习笔记
2019/03/19 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
Python标准库itertools的使用方法
2020/01/17 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
Linux常见面试题
2013/03/18 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
高级方案规划工程师岗位职责
2013/11/29 职场文书
劳动之星获奖感言
2014/02/01 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL