php数组编码转换示例详解


Posted in PHP onMarch 11, 2014

因为一些特殊字符的显示效果的原因不得不把习惯的utf-8工程改成了GBK,由于使用了ajax技术,又涉及到了老问题——编码转换。一些表单验证需要返回json数据,php的json_encode函数只支持utf-8编码,无奈只得iconv了,需要达到的效果是GBK数组转换成utf-8数组传给json_encode函数。

最开始的思路,将数组序列化后用iconv函数转换编码,之后再反序列化,代码如下:

unserialize(iconv('gbk','utf-8',serialize($array))); 

得到的结果是空白,后来想起来配置文件里设置了默认编码 ini_set('default_charset', 'gbk');   这样用gbk反序列化utf-8的字符串肯定不好用了,此处在序列化和反序列化之间加个ini_set('default_charset', 'utf-8'); 应该也是可以的,但这么弄总觉得有点别扭,因为是全局的编码设置,很容易导致其他地方的编码问题,比如数据库操作。那么换个思路,用构建数组原型的序列化方法,借助var_export函数,最终函数如下:

function array_iconv($in_charset,$out_charset,$arr){  
        return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';'));  
}

原理很简单 var_export设置第二个参数为true,返回数组原型字符串,将字符串转换为utf-8编码,之后再用eval来执行返回(类似匿名函数?),至此完美解决问题。

后续:后来在网上搜了下资料,看有没有更好的方法,找到的都大同小异,都是利用递归调用iconv的方式,如果数组元素过多或者维数多一些,性能上肯定不怎么样了,更好的是原生代码的方式,不需要考虑是N维数组还是关联数组,一切都已经自动完成,保证数组转换前后数据一致。从代码的长短以及循环和原生方法的比较上,相信大家已经有了选择。

PHP 相关文章推荐
如何删除多级目录
Oct 09 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
简单实现限定phpmyadmin访问ip的方法
Mar 05 PHP
LotusPhp笔记之:Logger组件的使用方法
May 06 PHP
PHP添加Xdebug扩展的方法
Feb 12 PHP
PHP Reflection API详解
May 12 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
关于php开启错误提示的总结
Sep 24 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
Oct 03 PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 #PHP
PHP输出缓存ob系列函数详解
Mar 11 #PHP
php初始化对象和析构函数的简单实例
Mar 11 #PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 #PHP
php调用c接口无错版介绍
Mar 11 #PHP
PHP goto语句简介和使用实例
Mar 11 #PHP
php调用C代码的实现方法
Mar 11 #PHP
You might like
我的论坛源代码(五)
2006/10/09 PHP
特转载一高手总结PHP学习资源和链接.
2006/12/05 PHP
php学习之 数组声明
2011/06/09 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
Jquery练习之表单验证实现代码
2010/12/14 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
原生js实现轮播图
2017/02/27 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
vue中的scope使用详解
2017/10/29 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
python中解析json格式文件的方法示例
2017/05/03 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
python实战之实现excel读取、统计、写入的示例讲解
2018/05/02 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
竞选班长的演讲稿
2014/04/24 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
2015中秋祝酒词
2015/08/12 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang