数组转换成JSON格式时,中文出现unicode编码“乱码”的解决方法

程序编程人员在进行数据的交互的时候经常会用的JSON的数据格式,这种数据格式结构清晰简洁是一种非常方便存储和传输的数据方式。但是我们在做PHP编程的时候常常会看到把数组里面的汉字进行json_encode格式转换后,就变成了"\u"开头的ASCII编码方式,看上去非常像乱码。就算我们用PHP在把JSON格式数据转换回数组后里面的汉字还是ASCII编码格式,看不到汉字。这里我们针对不同版本的PHP给出两个解决方法,下面以如下数组和JSON数据为例。
声明一个数组$arr=array('a'=>'牛人技术',‘b’=>'nrjs');
建立一个JSON数据{"keya":"牛人技术","keyb":"nrjs"}


方法一;PHP运行环境是php5.4或以上版本。
因为在PHP5.4版本之后,json_encode()函数增加了一个JSON_UNESCAPED_UNICODE的参数。这参数就是告诉PHP给中文汉字转换格式的时候不进行重新Unicode编码,而是直接把汉字放到JSON数据体中。如果想知道自己的PHP是不是支持这参数,可以通过phpinfo()函数来输出版本信息查看。具体事例代码是:
<?php
$by1='{"keya":"牛人技术","keyb":"nrjs"}';//这里注意"和'来区别
echo json_encode($by1, JSON_UNESCAPED_UNICODE);
?>
运行上面的PHP代码文件,即可看到带有中文的JSON数据了。

方法二;以前的老版本PHP环境。
在PHP5.4之前的版本,因为json_encode()需要把汉字进行Unicode重新编码的,所以转换出来的JSON数据在汉字部分会直接出现ASCII编码的样子,从而看不到汉字。如果碰到这种情况,最好是把自己的PHP进行升级。如果实在因为运行环境等客观原因无法升级PHP的话,这里提供一个曲线救国的思路。首先我们把带有汉字的数组中间的汉字部分使用urlencode编码这样整个数组就不会出现汉字了,然后再JSON_encode进行编码,半编码后的JSON数据中汉字部分再通过urldecode来解码,就得到带有汉字的JSON格式了。具体事例代码如下;
$arr=array('a'=>urlencode('牛人技术'),‘b’=>'nrjs');
$json=json_encode($arr);
echo urldecode($json);
或者使用正则替换方式
preg_replace_callback('/\\\\u([0-9a-f]{4})/i',create_function('$matches','return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'),$arr);

总结
总体来说早期PHP版本不能直接支持汉字进行JSON数据转换,其实是底层的操作,因为就算新版本PHP支持直接汉字中文转换,其实在底层还是进行了转码操作只是转码后再进行重新生成汉字。所以就算最新版的json_encode()函数也默认用unicode汉字编码。必须要加上函数参数后才能直接使用中文,这点在新版本编程中要注意。

本文由作者自行上传并发布,牛人技术博客仅提供信息发布平台。文章仅代表作者个人观点,不代表本博客立场。如需转载,必须声明出处。

网友评论 comments

发表评论

电子邮件地址不会被公开。必填项已用 *标注

暂无评论

牛人技术博客 | AboutUS | 湘ICP备13000282号-8 |
Copyright © 2009 - 2018 NRJS Corporation, All Rights Reserved
添加图标到手机桌面
扫二维码
扫二维码
返回顶部