php的iconv函数只支持对字符串的转换编码,如果是数组,就要自己遍历转换了,因此写如上的函数,对任意维数组进行转换,同时转换下标(索引)及值。
注意:不转对象。
function mult_iconv($in_charset,$out_charset,$data) { if(substr($out_charset,-8)=='//IGNORE'){ $out_charset=substr($out_charset,0,-8); } if(is_array($data)){ foreach($data as $key => $value){ if(is_array($value)){ $key=iconv($in_charset,$out_charset.'//IGNORE',$key); $rtn[$key]=mult_iconv($in_charset,$out_charset,$value); }elseif(is_string($key) || is_string($value)){ if(is_string($key)){ $key=iconv($in_charset,$out_charset.'//IGNORE',$key); } if(is_string($value)){ $value=iconv($in_charset,$out_charset.'//IGNORE',$value); } $rtn[$key]=$value; }else{ $rtn[$key]=$value; } } }elseif(is_string($data)){ $rtn=iconv($in_charset,$out_charset.'//IGNORE',$data); }else{ $rtn=$data; } return $rtn; }
调用示例:
$foobar=mult_iconv('gbk','utf-8','一个数组、字符串或其它类型数据');
一个复杂一点的测试示例(不转对象)
// ******* 一个复杂一点的测试示例 ******************** class MyClass { public $v1='不转对象,恭喜发财'; public $v2='skipped object'; public function f() { return true; } } $obj=new MyClass(); $foo=array('abcd','随便写点文字' ,array('中文下标'=> 789,'天地玄黄' =>array('宇宙洪荒'=>'赵钱孙李',300=>'恭喜发财,不转对象' ,array('更深的数组'=>'照样可以转换') ) ) ,'恭喜发财,不转对象' => $obj ,'如需转对象'=>'Do It Yourself!' ,'作者很懒'=>'用不到就不写了' ); $bar=mult_iconv('gbk','utf-8//IGNORE',$foo); var_dump($bar);
延伸阅读
- php使用iconv进行从utf-8转为gb2312字符编码出错解决方案
- Bypassing script filters with variable-width encodings
- 手把手教你在centos下编译安装配置高性能web服务器环境nginx+php(fast-cgi)+mysql等/适合小内存vps使用
- CGI原理示例,及CGI,FastCGI,php-cgi,php-fpm等的总结
- php+MSSQL的坑:(n)varchar型字段被截断
- 为windows下php5.2安装memcache等扩展/及扩展官方下载
- php版本(5.3,5.5,7.0)及运行模式(fast-cgi/fpm,apache模块)之间性能对比测试
- php识别图像类型为image/pjpeg格式,pjpeg是什么?
- PHP_带smtp验证的发邮件函数
- php程序优化的几个关键点
- centos 6下编译安装php时安装mcrypt支持库
- mysql join查询时,参与join的字段字符集编码不同,对性能影响是巨大的
- [转]趣话字符集与字符编码
- PHP字符编码绕过漏洞总结
- php程序中的编码转换
這篇博文幫助到了我。謝謝