Подтвердить что ты не робот

Как решить ошибку JSON_ERROR_UTF8 в php json_decode?

Я пытаюсь использовать этот код

$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".

Как я могу это решить?

4b9b3361

Ответ 1

Существует хорошая функция для дезинфекции ваших массивов.

Я предлагаю вам использовать обертку 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()

Ответ 2

Вам нужна простая строка кода:

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

Кредит: Санг Ле, моя команда дала мне этот код. Да!

Ответ 3

Функция iconv довольно бесполезна, если вы не можете гарантировать, что вход действителен. Вместо этого используйте mb_convert_encoding.

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

Вы можете получить более явное, чем "авто", и даже указать список ожидаемых входных кодировок, разделенных запятыми.

Самое главное, что недопустимые символы будут обработаны, не вызывая отбрасывание всей строки (в отличие от iconv).