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 26 PHP
php 上传功能实例代码
Apr 13 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 PHP
php异常处理方法实例汇总
Jun 24 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
php自定义类fsocket模拟post或get请求的方法
Jul 31 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
万能的php分页类
Jul 06 PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
PHP 裁剪图片
Mar 09 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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
cakephp打印sql语句的方法
2015/02/13 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
Javascript函数的参数
2015/07/16 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
nodeJS微信分享
2017/12/20 NodeJs
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
keras 多gpu并行运行案例
2020/06/10 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
英国高街电视:High Street TV
2018/05/22 全球购物
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
纺织工程专业个人求职信范文
2014/01/27 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
七年级作文之冬景
2019/11/07 职场文书
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python
Nginx如何配置根据路径转发详解
2022/07/23 Servers