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

2023-12-06    分类: 网站建设

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

网站题目:phpjsonencode编码pHp项目中遇到中文乱码怎么办?有解决方法吗?
标题链接:/news12/299412.html

成都网站建设公司_创新互联,为您提供云服务器标签优化网站策划品牌网站设计定制网站建站公司

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设