json_encode() превращает не-UTF8 строки в ноль, но на живом сайте возвращает false

В рамках, которые я должен использовать для проекта (Lithium), вывод на конкретной странице проходит через json_encode(), Локально и в прямом эфире я пытаюсь с одними и теми же данными, и результат:

  1. Локально он возвращает JSON, но некоторые значения превращаются в null,
  2. Живой сайт - возвращается false,

В обоих случаях, когда я бегу json_last_error() - это дает мне int(5), я могу бежать phpinfo() в обоих местах, если какая-то настройка вызывает проблему. (Локально я с PHP 5.3.*, В прямом эфире это 5.5.9.)

4 ответа

На самом деле вам нужно использовать дополнительные параметры json_encode в случае символов UTF8

Таким образом, вы можете использовать

JSON_UNESCAPED_UNICODE опция JSON_ENCODE

Пример:

json_encode($array, JSON_UNESCAPED_UNICODE)

Посетите php документацию здесь.

Хотя это не задокументировано в журнале версий здесь, поведение обработки не-UTF8 изменилось в 5.5, что может затруднить отладку.

Передача не-UTF-8 строки в json_encode() заставит функцию возвращать false в PHP 5.5, в то время как она только аннулирует эту строку (и только эту) в предыдущих версиях.

В файле с кодировкой Latin-1 напишите это:

$a = array('é', 1);
var_dump(json_encode($a));

PHP <5.4: string(8) "[null,1]"

PHP> = 5.5: bool(false)

Конечно, в PHP 5.5 это правильно (если кодирование завершится неудачно, верните false), но при обновлении до 5.5 он может привести к ошибкам, поскольку ранее вы могли получить оставшуюся часть JSON, даже если одна строка отсутствовала в UTF8 (если эта строка не была б, ты бы никогда не уведомил, что это обнуляется)

Наконец - я использовал слегка измененную версию этой сущности - http://gist.github.com/oscar-broman/3653399 - но вместо свойств кодирования - я удаляю все строки не-UTF8... и это работает, Но - мне пришлось изменить PHP-фреймворк, который использует веб-сайт... и это то, чего я действительно старался избегать............ но в любом случае, этот подход пока работает:) ...

Я получаю ту же ошибку с PhP 7.3.

Вы можете исправить это несколькими способами:

  1. Игнорировать символ no-UTF8
      json_encode(array("a" => "ç"), JSON_INVALID_UTF8_IGNORE);

Это решение подойдет, если вы просто хотите игнорировать все возможные странные признаки, не пытаясь их показать.

  1. Заменить символ no-UTF8
      json_encode(array("a" => "ç"), JSON_INVALID_UTF8_SUBSTITUTE);

Это возможно, но в моем случае я получал "?" результат.

  1. UTF8-ize char
      json_encode(array("a" => utf8_encode("ç")));

Я использую это решение, которое просто конвертирует в формат UTF8 все символы.

Другие вопросы по тегам