php json encode 编码 PHP项目中遇到中文乱码怎么办?有解决方法吗?
2021-01-31
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上,我将继续将一些常用功能封装到该公共类中。欢迎下载。希望这对大家有帮助。