如何解决php json_decode中的JSON_ERROR_UTF8错误?

我正在尝试这个代码

$json = file_get_contents("http://www.google.com/alerts/preview?q=test&t=7&f=1&l=0&e"); print_r(json_decode(utf8_encode($json), true)); ////////////// // Define the errors. $constants = get_defined_constants(true); $json_errors = array(); foreach ($constants["json"] as $name => $value) { if (!strncmp($name, "JSON_ERROR_", 11)) { $json_errors[$value] = $name; } } // Show the errors for different depths. foreach (range(4, 3, -1) as $depth) { var_dump(json_decode($json, true, $depth)); echo 'Last error: ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL; } 

我已经尝试了很多函数,html_entities_decode,utf8_encode和解码,解码hex代码,但我总是得到错误“JSON_ERROR_UTF8”。

我怎么能解决这个问题?

有一个很好的function来清理你的数组。

我build议你使用这样的json_encode包装:

 function safe_json_encode($value){ if (version_compare(PHP_VERSION, '5.4.0') >= 0) { $encoded = json_encode($value, JSON_PRETTY_PRINT); } else { $encoded = json_encode($value); } switch (json_last_error()) { case JSON_ERROR_NONE: return $encoded; case JSON_ERROR_DEPTH: return 'Maximum stack depth exceeded'; // or trigger_error() or throw new Exception() case JSON_ERROR_STATE_MISMATCH: return 'Underflow or the modes mismatch'; // or trigger_error() or throw new Exception() case JSON_ERROR_CTRL_CHAR: return 'Unexpected control character found'; case JSON_ERROR_SYNTAX: return 'Syntax error, malformed JSON'; // or trigger_error() or throw new Exception() case JSON_ERROR_UTF8: $clean = utf8ize($value); return safe_json_encode($clean); default: return 'Unknown error'; // or trigger_error() or throw new Exception() } } function utf8ize($mixed) { if (is_array($mixed)) { foreach ($mixed as $key => $value) { $mixed[$key] = utf8ize($value); } } else if (is_string ($mixed)) { return utf8_encode($mixed); } return $mixed; } 

在我的应用程序中,utf8_encode()比iconv()

你需要简单的代码行:

 $input = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($input)); $json = json_decode($input); 

信贷:桑乐,我的茶友给了我这个代码。 是啊!

除非可以保证input有效,iconv函数是毫无价值的。 改用mb_convert_encoding。

 mb_convert_encoding($value, "UTF-8", "auto"); 

你可以比“auto”更明确,甚至指定一个逗号分隔的期望input编码列表。

最重要的是,无效字符将被处理,而不会导致整个string被丢弃(不像iconv)。