收藏此站 联系我们 宿迁腾云网络公司
全部 网站建设 SEO优化 技术日志
当前位置:网站首页 > 技术日志

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);

以上代码的输出结果为

php json encode 数字_php json encode 转义_php json encode 编码

{"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 json encode 转义_php json encode 数字_php json encode 编码

我们知道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}

php json encode 数字_php json encode 编码_php json encode 转义

最后,通过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上,我将继续将一些常用功能封装到该公共类中。欢迎下载。希望这对大家有帮助。


标签:编码转换 php urlencode
转载请注明来源:https://www.tyweb.net/jsrz/368.html
现在咨询免费送诊断方案,每天限3名
马上填写资料获取方案
腾云网络产品
网站建设 微信小程序 微商城 APP开发 SEO优化
腾云网络服务
7x24小时售后支持 市内上门服务 免费后台培训 定期回访
关于腾云网络
关于我们
网站建设案例 小程序案例 APP开发案例
联系腾云网络
联系腾云网络
紧急问题处理电话
131-6035-5545 131-6035-5545
131-6035-5545
扫一扫关注腾云网络公众号