首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP json中的Malformed UTF-8 characters问题

PHP json中的Malformed UTF-8 characters问题

原创
作者头像
杨昕
修改2018-12-04 15:07:12
3.5K0
修改2018-12-04 15:07:12
举报
文章被收录于专栏:web后端web后端

json_encode函数原型:

string json_encode (mixed $value[, int $options = 0 [, int $depth = 512 ]])

成功则返回 JSON 编码的 string 或者在失败时返回 FALSE 。

一般情形下,json嵌套层级太深这种失败是罕见,但是又相对比较容易识别的;另外一种错误,是关于utf-8编码的,则情形相对比较复杂;

$wrong_encoding = urldecode("%CD");
$arr = [$wrong_encoding,["123"=>["234"=>$wrong_encoding]]];
var_dump(json_encode($arr));//bool(false)

这个例子是利用urlcode不检查编码,生成了不合法的utf-8字符串;

多字节残缺的UTF-8编码的二进制数据会影响到字符串的边界;

echo ord(urldecode("%CD"));//205

205的二进制形式为:11001101 [UTF-8](http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html)

UTF-8编码规则下,这应该是一个双字节字符,明显可以看到,这里是一个单字节字符;

下面则是处理方式:

function json_encode_with_utf8_detect($arr,$replace = null){
    $json = json_encode($arr);
    //没有utf-8编码问题的,直接返回encode之后内容
    if($json !== false || json_last_error() != JSON_ERROR_UTF8){
        return $json;
    }
    array_walk_recursive($arr,function (&$value)use($replace){
        if(is_string($value)){
            $value = mb_check_encoding($value,'UTF-8') ? $value : $replace;
        }
    });
    return json_encode($arr);
}

在检测到数组内部存在某些错误编码的字符串,用$replace代替改内容,然后返回对应的json数据

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档