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 Mysql日期和时间函数集合
Nov 16 PHP
php 对输入信息的进行安全过滤的函数代码
Jun 29 PHP
一个PHP的远程图片抓取函数分享
Sep 25 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
php支付宝接口用法分析
Jan 04 PHP
php使用socket post数据到其它web服务器的方法
Jun 02 PHP
php session的锁和并发
Jan 22 PHP
thinkphp3.2实现上传图片的控制器方法
Apr 28 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
php实现登陆模块功能示例
Oct 20 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
详解Laravel框架的依赖注入功能
May 27 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代码
2010/08/08 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
php测试kafka项目示例
2020/02/06 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
Python 字典与字符串的互转实例
2017/01/13 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
Python守护进程实现过程详解
2020/02/10 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
HTML5的新特性(1)
2016/03/03 HTML / CSS
护士自我鉴定范文
2013/10/06 职场文书
中国好声音华少广告词
2014/03/17 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
高中班主任寄语
2019/06/21 职场文书
Html5调用企业微信的实现
2021/04/16 HTML / CSS
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js