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中批量修改文件后缀名的函数代码
Oct 23 PHP
php获取目标函数执行时间示例
Mar 04 PHP
php密码生成类实例
Sep 24 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
Dec 09 PHP
PHP stream_context_create()函数的使用示例
May 12 PHP
thinkPHP的表达式查询用法详解
Sep 14 PHP
php创建图像具体步骤
Mar 13 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
Apr 18 PHP
PHP基于回溯算法解决n皇后问题的方法示例
Nov 07 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
Python常用库推荐
2016/12/04 Python
详解Python如何生成词云的方法
2018/06/01 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
检察院起诉意见书
2015/05/20 职场文书
检讨书范文
2019/04/16 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis