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下载远程文件类(支持断点续传)
Nov 14 PHP
php垃圾代码优化操作代码
Aug 05 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
用Simple Excel导出xls实现方法
Dec 06 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
php反射类ReflectionClass用法分析
May 12 PHP
Yii框架表单提交验证功能分析
Jan 07 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
PHP实现 APP端微信支付功能
Jun 22 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 PHP
PHP 对接美团大众点评团购券(门票)的开发步骤
Apr 03 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
php安装swoole扩展的方法
2015/03/19 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
CI框架简单分页类用法示例
2020/06/06 PHP
JavaScript prototype对象的属性说明
2010/03/13 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
javascript判断office版本示例
2014/04/11 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
javascript如何写热点图
2015/12/08 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
python 多线程串行和并行的实例
2019/02/22 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
python实现简单的购物程序代码实例
2020/03/03 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
结婚喜宴家长答谢词
2014/01/15 职场文书
质量月活动策划方案
2014/03/10 职场文书
会议接待欢迎标语
2014/10/08 职场文书
员工辞职信范文
2015/03/02 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
团委副书记工作总结
2015/08/14 职场文书