json_encode() превращает не-UTF8 строки в ноль, но на живом сайте возвращает false
В рамках, которые я должен использовать для проекта (Lithium), вывод на конкретной странице проходит через json_encode()
, Локально и в прямом эфире я пытаюсь с одними и теми же данными, и результат:
- Локально он возвращает JSON, но некоторые значения превращаются в
null
, - Живой сайт - возвращается
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.
Вы можете исправить это несколькими способами:
- Игнорировать символ no-UTF8
json_encode(array("a" => "ç"), JSON_INVALID_UTF8_IGNORE);
Это решение подойдет, если вы просто хотите игнорировать все возможные странные признаки, не пытаясь их показать.
- Заменить символ no-UTF8
json_encode(array("a" => "ç"), JSON_INVALID_UTF8_SUBSTITUTE);
Это возможно, но в моем случае я получал "?" результат.
- UTF8-ize char
json_encode(array("a" => utf8_encode("ç")));
Я использую это решение, которое просто конвертирует в формат UTF8 все символы.