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 相关文章推荐
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
PHP原生模板引擎 最简单的模板引擎
Apr 25 PHP
PHP之预定义接口详解
Jul 29 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
基于PHP制作验证码
Oct 12 PHP
PHP基于curl后台远程登录正方教务系统的方法
Oct 14 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
PHP isset()及empty()用法区别详解
Aug 29 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
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
ElementUI之Message功能拓展详解
2019/10/18 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
Python中的pass语句使用方法讲解
2015/05/14 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
python制作mysql数据迁移脚本
2019/01/01 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
python的列表List求均值和中位数实例
2020/03/03 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
竞聘演讲稿范文
2014/01/12 职场文书
高一英语教学反思
2014/01/22 职场文书
幼教简历自我评价
2014/01/28 职场文书
导师工作推荐信
2015/03/27 职场文书
物资采购管理制度
2015/08/06 职场文书
关于军训的感想
2015/08/07 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
创业计划书之甜品店
2019/09/18 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL