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 删除。