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 相关文章推荐
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
php实现的简单日志写入函数
Mar 31 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
PHP类的封装与继承详解
Sep 29 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
PHP中list方法用法示例
Dec 01 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
PHP如何根据文件头检测文件类型实例代码
Oct 14 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
laravel 中某一字段自增、自减的例子
Oct 11 PHP
php实现断点续传大文件示例代码
Jun 19 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中养成7个面向对象的好习惯
2010/07/17 PHP
深入密码加salt原理的分析
2013/06/06 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
2014/03/19 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
Python的lambda匿名函数的简单介绍
2013/04/25 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
在Python下尝试多线程编程
2015/04/28 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
matplotlib绘制动画代码示例
2018/01/02 Python
Python实现多进程的四种方式
2019/02/22 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
食品安全工作方案
2014/05/07 职场文书
测控技术自荐信
2014/06/05 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
个人贷款收入证明
2014/10/26 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS