分享到: 分享到QQ  分享到Twitter

作者: kideny    访问次数: 736 创建时间: 2021-02-01 21:39:42 更新时间: 2024-05-03 17:47:35

最近两年PHP的版本更新越来越快,不过随之而来的就是bug也越来越多,PHP与开发框架的版本升级导致项目越来越不稳定。这两天就碰到一个恼人的问题,代码原封未动的情况下,json_encode返回数据报错。

 

错误代码如下:

 

Class: InvalidArgumentException:

Exception: json_encode error: Malformed UTF-8 characters, possibly incorrectly encoded

 

报错原因解析:

 

这个问题实际上,从PHP7.2开始就会报错。源头需要去查询PHP的官方文档,地址如下

https://www.php.net/manual/zh/function.json-encode.php

json_encode这个函数,从PHP7.1开始,到PHP7.2和PHP7.3,每个版本都进行了改动。其中,PHP7.2给json_encode引入了一个标记  JSON_INVALID_UTF8_IGNORE。

当json_encode处理的数据当中,出现了错误的不符合UTF8规则的字符,就会报错。

在PHP7.2以前,PHP是默认忽略这个错误。从PHP7.2开始,这个报错会直接导致你代码GG了,需要在json_encode代码时,添加 JSON_INVALID_UTF8_IGNORE,才能忽略这个错误。

当你返回的数据当中,有二进制的代码时,如果不添加这个标记,就一定会报错。

 

修复方法演示,以Phalcon框架为例:

 

PHP7.2以前没有问题的代码,这个代码在PHP7.2以后会报错

            $params = [
                'parent = :parent: AND isActivated = 1',
                'bind' => [
                    'parent' => $binParent,
                ],
            ];
            $data = Model::find($params);
            return $this->response->setJsonContent([
                "status" => "ok",
                "message" => $data
            ]);

 PHP7.2以后,修复BUG的代码。

            $params = [
                'parent = :parent: AND isActivated = 1',
                'bind' => [
                    'parent' => $binParent,
                ],
            ];
            $data = Model::find($params);
            return $this->response->setJsonContent([
                "status" => "ok",
                "message" => $data
            ], JSON_INVALID_UTF8_IGNORE, 512);

Phalcon官方网站,对此也有详细说明,https://docs.phalcon.io/4.0/zh-cn/response

 

总结

 

其他PHP框架如果出现类似问题,可以去框架的官网,查询对应的正确处理json_encode的方法。

季度最有价值文章

月度最有价值文章

投票统计

是否原创: 0 %

0 % Complete (success)

是否有价值: 0 %

0% Complete

是否有素质: 0 %

0% Complete (warning)

是否合法: 0 %

0% Complete

   群组工具