问题描述:
一个老的上线项目,通过httpclient调用第三方接口后返回值通过json_decode获取到数据一直为null,猜测是获取的原始数据问题。使用json_last_error()对json_decode做一个精准的错误判断:
switch (json_last_error()) {
case JSON_ERROR_NONE:
// echo ' - No errors';
Logger::getInstance()->error('------ - No errors-----');
break;
case JSON_ERROR_DEPTH:
// echo ' - Maximum stack depth exceeded';
Logger::getInstance()->error('------ - Maximum stack depth exceeded-----');
break;
case JSON_ERROR_STATE_MISMATCH:
// echo ' - Underflow or the modes mismatch';
Logger::getInstance()->error('------ -Underflow or the modes mismatch-----');
break;
case JSON_ERROR_CTRL_CHAR:
// echo ' - Unexpected control character found';
Logger::getInstance()->error('------ -Unexpected control character found-----');
break;
case JSON_ERROR_SYNTAX:
// echo ' - Syntax error, malformed JSON';
Logger::getInstance()->error('------ -Syntax error, malformed JSON-----');
break;
case JSON_ERROR_UTF8:
// echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
Logger::getInstance()->error('------ - Malformed UTF-8 characters, possibly incorrectly encoded-----');
break;
default:
// echo ' - Unknown error';
Logger::getInstance()->error('------ - Unknown error----');
break;
}
------ - Malformed UTF-8 characters, possibly incorrectly encoded-----
说明原始数据格式错误,包含非法的UTF-8字符。
解决问题:
尝试了多种方式没有解决,如下:
# 设置内部字符编码为 UTF-8
mb_internal_encoding("UTF-8");
# 使用mb_convert_encoding
mb_convert_encoding($value, "UTF-8", "auto");
#html_entities_decode,utf8_encode
以上均没有很好解决。
最终解决问题的可行的方法:
$return_str = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($return_str));
$return = json_decode($return_str);