问题描述:

一个老的上线项目,通过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);