phpjsonencode编码pHp项目中遇到中文乱码怎么办?有解决方法吗?

发布时间:2025-03-14 点击:26
php项目中经常遇到中文乱码,这是一个令人讨厌的问题。但是,当需要将内容输出到网页时,我们遵循以下两个原则,并且通常不会出现中文乱码。
首先是添加html头
第二点是确保文件的编码与meta设置的编码一致。换句话说,如果我们的第一个字符集设置为utf-8,那么我们的文件编码也应该设置为utf-8。两者应该保持一致。
当然,以上是针对网页的情况,但是现在随着ajax在web应用程序中所占的比例越来越高,json格式的数据在数据传输中的使用越来越广泛。因此,当您使用json_encode在php中将数据转换为json时,会遇到中文乱码或中文编码的问题。
例如,
$data = array('id'=>1,'name'=>'迹忆博客','parid'=>0);echo json_encode($data);
以上代码的输出结果为
{id:1,name:\u8ff9\u5fc6\u535a\u5ba2,parid:0}
让我们看一下,该功能已对中文“集意博客”进行了十六进制转码。不能说这是一个错误,因为十六进制表示形式是正确的中文。得到此结果后php json encode 编码,我们还可以通过前端的js获得所需的结果。但是,以这种方式使用仍然很麻烦。当然,情况会因php版本而异。
对于某些版本的php,结果将如下所示
{id:1,name:null,parid:0}
中文无法正确解析。
没有办法,中国问题太麻烦了。谁使计算机不是中国人发明的?当然,有解决方案。让我们了解两种解决方案。
一、由json_encode的第二个参数解决
为解决上述问题,可以通过json_encode函数本身直接解决php> =5.4.0的版本。那是第二个参数加上json_unescaped_unicode。
$data = array('id'=>1,'name'=>'迹忆博客','parid'=>0);echo json_encode($data, json_unescaped_unicode);
现在您可以获得正确的结果
{id:1,name:迹忆博客,parid:0}
正确获得了结果。但是,php的版本不能更改为5.4及更高版本。如何处理5.4以下的版本?
二、通过url编码解决中文问题
我们知道php中有两个函数:urlencode和urldecode。我们可以使用urlencode函数对中文进行url编码,这样字符串中就不会再有中文了,也不会遇到中文编码问题。
$str = “迹忆博客”;echo urlencode($str);
对jiyi博客进行网址编码,结果如下
%e8%bf%b9%e5%bf%86%e5%8d%9a%e5%ae%a2
因此,在使用urlencode编码上述数组的名称的值,然后将其转换为json格式后,中文编码的问题将不复存在。
我们现在得到的结果是名称编码后的json字符串
{id:1,name:%e8%bf%b9%e5%bf%86%e5%8d%9a%e5%ae%a2,parid:0}
最后,通过urldecode对url编码的字符串进行解码。当然,urldecode解码不需要我们找到相应的编码字符串进行解码。我们可以直接解码整个字符串。 urldecode将自动检测相应的url编码的字符串并将其解码。
$data = array('id'=>1,'name'=>urlencode('迹忆博客'),'parid'=>0);$res =urldecode(json_encode($data));echo $res;
所以结果是正确的
{id:1,name:迹忆博客,parid:0}
此方法没有版本限制php json encode 编码,但是效率肯定会比第一种方法慢。
第二种方法的包装函数-通过url编码解决中文问题
现在是问题所在。对于第二种方法,我们不能在数组中的每个中文前面添加urlencode函数!这也是不现实的。然后,我们可以通过自己封装json_encode函数来解决此类问题。
代码如下
function onmpw_json_encode($data){ if(is_object($data)) return false; if(is_array($data)){ $data = deal_array($data); } return urldecode(json_encode($data));}function deal_array($data){ if (is_array($data)) { foreach ($data as $key => $val) { if (is_array($val)) { //如果是多维数组,通过递归来处理多维数组 $data[$key] = deal_array($val); } else { //对值进行url编码 $data[$key] = urlencode($val); } } } elseif (is_string($data)) { $data = urlencode($data); } return $data;}下面我们来看一个使用示例$data = array( array('id'=>1,'name'=>'迹忆博客','parid'=>0), array('id'=>2,'name'=>'学无止境','parid'=>1), array('id'=>3,'name'=>'趣味杂谈','parid'=>1), array('id'=>4,'name'=>'编程语言','parid'=>2), array('id'=>5,'name'=>'网络','parid'=>2), array('id'=>6,'name'=>'算法','parid'=>2), array('id'=>7,'name'=>'操作系统','parid'=>2), array('id'=>8,'name'=>'数据库','parid'=>2), array('id'=>9,'name'=>'web前端','parid'=>2), array('id'=>10,'name'=>'读书','parid'=>3), array('id'=>11,'name'=>'观点与感想','parid'=>3) );$data = onmpw_json_encode($data);echo $data;
现在我们有了想要的结果
[{id:1,name:迹忆博客,parid:0},{id:2,name:学无止境,parid:1},{id:3,name:趣味杂谈,parid:1},{id:4,name:编程语言,parid:2},{id:5,name:网络,parid:2},{id:6,name:算法,parid:2},{id:7,name:操作系统,parid:2},{id:8,name:数据库,parid:2},{id:9,name:web前端,parid:2}, {id:10,name:读书,parid:3},{id:11,name:观点与感想,parid:3}]
中文编码问题非常普遍,我们都需要根据实际情况进行更多总结。您可以轻松解决将来的开发中的类似问题。
对于上面的自定义json_encode函数,我将其封装在一个公共类中。源代码在github上,我将继续将一些常用功能封装到该公共类中。欢迎下载。希望这对大家有帮助。


混合云将在企业级云计算市场“唱主角”
上海网站制作公司建站注重用户体验
网站做百度优化应该从哪几个方面入手呢?
网站营销是什么?网站营销怎么做?
重庆小型的企业网站如何策划设计7点
公司网站开发后要索取源文件
网站定位越精准用户就越喜欢
动态DNS是什么?DDNS是怎么工作的?