Я пробую этот код
$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 и декодировал, декодировал шестнадцатеричные коды, но всегда получаю ошибку «JSON_ERROR_UTF8».
Как я могу это решить?
Существует хорошая функция для дезинфекции ваших массивов.
Я предлагаю использовать оболочку json_encode следующим образом:
function safe_json_encode($value, $options = 0, $depth = 512){ $encoded = json_encode($value, $options, $depth); 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, $options, $depth); 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);
Кредит: Санг Ле, моя команда дала мне этот код. Да!
Функция iconv довольно бесполезна, если вы не можете гарантировать, что вход действителен. Вместо этого используйте mb_convert_encoding.
mb_convert_encoding($value, "UTF-8", "auto");
Вы можете получить более явное, чем «авто», и даже указать список ожидаемых входных кодировок, разделенных запятыми.
Самое главное, что недопустимые символы будут обрабатываться, не вызывая отбрасывание всей строки (в отличие от iconv).