php json encode json unescaped unicode

json_encode

Описание

Returns a string containing the JSON representation of value.

Список параметров


Возвращаемые значения

Возвращает данные в формате JSON string on success.

Примеры

Пример 1. A json_encode() example

Результат выполнения данного примера:

Пример 2. A json_encode()
Пример 3. Эмулятор json_encode()
Пример 3. Сохранение русских букв(кирилицы) при использовании json_encode()

А вот пример кодирования сервером строки JSON при помощи стандартной функции в php «json_encode()» и добавочной к ней. В результате русские буковки остаются русскими. Начиная с версии PHP 5.4.0. можно воспользоваться стандартныой опцией JSON_UNESCAPED_UNICODE

Исходный объект в кодировке UTF-8.

Проблемы с которыми сталкиваются программисты

Доступ к полям

Проблема заключается в том что json_encode имеет доступ только к публичным полям объекта. Например если у вас есть класс

то результатом выполнения следующего кода будет:

как видно в результирующий json были включены только публичные поля.
Что же делать если нужны все поля?

Для php >= 5.4 достаточно будет реализовать интерфейс JsonSerializable для нашего класса, что подразумевает добавление метода jsonSerialize который будет возвращать структуру представляющую объект для json_encode

Теперь мы можем использовать json_encode как и раньше

Почему не стоит использовать подход с toJson методом?
Многие наверно заметили что подход с созданием метода возвращающего json может быть использован и в версиях php >= 5.4. Так почему же не воспользоваться им? Все дело в том что ваш класс может быть использован как часть иной структуры данных

и результат уже будет совсем другой. Также класс может использоваться другими программистами, для которых такой тип получение json-а с объекта может быть не совсем очевиден.

Что если у меня очень много полей в класcе?
В таком случае можно воспользоваться функцией get_object_vars

А если нужно private-поля, из класса, который нет возможности редактировать?
Может получиться ситуация когда нужно получить private поля (именно private, т.к. доступ к protected полям можно получить через наследование) в json-е. В таком случае необходимо будет воспользоваться рефлексией:

Кодировка текстовых значений

Кириллица и другие знаки в UTF8
Второй тип распространённых проблем с json_encode это проблемы с кодировкой. Часто текстовые значения которые нужно кодировать в json имеют в себе символы в UTF8 (в том числе кириллица) в результате эти символы будут представлены в виде кодов:

Отображение таких символов лечится очень просто — добавлением флага JSON_UNESCAPED_UNICODE вторым аргументом к функции json_encode:

Символы в других кодировках
Функция json_encode воспринимает строковые значения как строки в UTF8, что может вызвать ошибку, если кодировка другая. Рассмотрим маленький кусочек кода (данный пример кода максимально упрощен для демонстрации проблемной ситуации)

На первый взгляд ничего не предвещает проблем, да и что здесь может пойти не так? Я тоже так думал. В подавляющем большинстве случаев все будет работать, и по этой причине поиск проблемы занял у меня несколько больше времени, когда я впервые столкнулся с тем что результатом json_encode было false.

Как можно увидеть из ошибки: проблема с кодировкой переданной строки (это не UTF8). Решение проблемы очевидное — привести значение в UTF8

Цифровые значения

Последняя типовая ошибка связана с кодированием числовых значений.

Как известно php не строго типизированный язык и позволяет использовать числа в виде строки, в большинстве случаев это не приводит к ошибкам внутри php приложения. Но так как json очень часто используется для передачи сообщений между приложениями, такой формат записи числа может вызвать проблемы в другом приложении. Желательно использовать флаг JSON_NUMERIC_CHECK:

Уже лучше. Но как видим «3.0» превратилось в 3, что в большинстве случаев будет интерпретировано как int. Используем еще один флаг JSON_PRESERVE_ZERO_FRACTION для корректного преобразования в float:

Прошу также обратить внимание на следующий фрагмент кода, что иллюстрирует ряд возможных проблем с json_encode и числовыми значениями:

Источник

PHP decoding and encoding json with unicode characters

I have some json I need to decode, alter and then encode without messing up any characters.

I can use utf8_encode which will allow the string to be decoded with json_decode, however the character gets mangled into something else. This is the result from a print_r of the result array. Two characters.

When I encode the array again I the character escaped to ascii, which is correct according to the json spec:

Is there some way I can un-escape this? json_encode gives no such option, utf8_encode does not seem to work either.

Edit I see there is an unescaped_unicode option for json_encode. However it’s not working as expected. Oh damn, it’s only on php 5.4. I will have to use some regex as I only have 5.3.

8 Answers 8

I have found following way to fix this issue. I hope this can help you.

php json encode json unescaped unicode. Смотреть фото php json encode json unescaped unicode. Смотреть картинку php json encode json unescaped unicode. Картинка про php json encode json unescaped unicode. Фото php json encode json unescaped unicode

Judging from everything you’ve said, it seems like the original Odómetro string you’re dealing with is encoded with ISO 8859-1, not UTF-8.

Here’s why I think so:

PHP will use the \uXXXX escaping, but as you noted, this is valid JSON.

Finally, as another answer noted, you do need to make sure that you’re declaring the proper charset, with an HTTP header or otherwise (of course, this particular issue might have just been an artifact of the environment where you did your print_r testing).

Источник

json_encode в PHP превращает кирилицу в \u041D коды

php json encode json unescaped unicode. Смотреть фото php json encode json unescaped unicode. Смотреть картинку php json encode json unescaped unicode. Картинка про php json encode json unescaped unicode. Фото php json encode json unescaped unicode

В несколько более ранних версиях языка PHP (где JSON_UNESCAPED_UNICODE ещё нет) успешно срабатывает вот такая штука:

И применяют её при выводе JSON вот таким образом:

php json encode json unescaped unicode. Смотреть фото php json encode json unescaped unicode. Смотреть картинку php json encode json unescaped unicode. Картинка про php json encode json unescaped unicode. Фото php json encode json unescaped unicode

OnYourLips, смысл в том, что серверов много, админов — мало, и обновление не запланировано. а поддерживать мультибайт кодировки надо сейчас. Архитектор проекта не знал, о том что такая проблема возникнет, да и я сам не знал пока не наткнулся на неё.

Решение котороя я использую:

php json encode json unescaped unicode. Смотреть фото php json encode json unescaped unicode. Смотреть картинку php json encode json unescaped unicode. Картинка про php json encode json unescaped unicode. Фото php json encode json unescaped unicode

php json encode json unescaped unicode. Смотреть фото php json encode json unescaped unicode. Смотреть картинку php json encode json unescaped unicode. Картинка про php json encode json unescaped unicode. Фото php json encode json unescaped unicode

Собственно, «исправлять» не обязательно (хотя в плане перфекционизма я вас хорошо понимаю). Это легитимные JS-строки, в браузере отображаются корректно. Объём данных, правда, больше. Но, с другой стороны, Gzip-сжатием этот фактор минимизируется. 😉

Можно ещё делать так:

Тогда в свежих версиях PHP JSON-код будет наиболее оптимальным по объёму, а в более старых — всего лишь несколько менее оптимальным.

Источник

(PHP 5 >= 5.2.0, PECL json >= 1.2.0, PHP 7)

json_encode — Возвращает JSON-представление данных

Описание

Список параметров

Все строковые данные должны быть в кодировке UTF-8.

И хотя это надмножество согласуется с расширенным определением «JSON текста» из новых » RFC 7159 (который старается заменить собой RFC 4627) и » ECMA-404, это все равно может приводить к проблемам совместимости со старыми парсерами JSON, которые строго придерживаются RFC 4627 с кодированием скалярных значений.

Задает максимальную глубину. Должен быть больше нуля.

Возвращаемые значения

Возвращает JSON закодированную строку ( string ) в случае успеха или FALSE в случае возникновения ошибки.

Список изменений

Примеры

Пример #1 Пример использования json_encode()

Результат выполнения данного примера:

Результат выполнения данного примера:

Пример #3 Пример с последовательными индексами начинающимися с нуля и непоследовательными индексами массивов

Результат выполнения данного примера:

Примечания

В случае ошибки кодирования, можно использовать json_last_error() для определения точной ошибки.

При кодировании массива в случае, если его индексы не являются последовательными числами от нуля, то все индексы кодируются в строковые ключи для каждой пары индекс-значение.

Смотрите также

Источник

Решение типовых проблем с json_encode (PHP)

Это краткая статья о наиболее вероятных проблемах с json_encode и их решениях. Иногда при кодировании данных в json, с помощью json_encode в php, мы получаем не тот результат который ожидаем. Я выделил три наиболее частые проблемы с которыми сталкиваются программисты:

Доступ к полям

Проблема заключается в том что json_encode имеет доступ только к публичным полям объекта. Например если у вас есть класс

то результатом выполнения следующего кода будет:

как видно в результирующий json были включены только публичные поля.
Что же делать если нужны все поля?

Решение

Для php = 5.4:
достаточно будет реализовать интерфейс JsonSerializable для нашего класса, что подразумевает добавление метода jsonSerialize который будет возвращать структуру представляющую объект для json_encode

Теперь мы можем использовать json_encode как и раньше

Почему не стоит использовать подход с toJson методом?

Многие наверно заметили что подход с созданием метода возвращающего json может быть использован и в версиях php >= 5.4. Так почему же не воспользоваться им? Все дело в том что ваш класс может быть использован как часть иной структуры данных

и результат уже будет совсем другой.
Также класс может использоваться другими программистами, для которых такой тип получение json-а с объекта может быть не совсем очевиден.

Что если у меня очень много полей в класcе?

В таком случае можно воспользоваться функцией get_object_vars

А если нужно private-поля, из класса, который нет возможности редактировать?

Может получиться ситуация когда нужно получить private поля (именно private, т.к. доступ к protected полям можно получить через наследование) в json-е. В таком случае необходимо будет воспользоваться рефлексией:

Кодировка текстовых значений

Кириллица и другие знаки в UTF8

Второй тип распространённых проблем с json_encode это проблемы с кодировкой. Часто текстовые значения которые нужно кодировать в json имеют в себе символы в UTF8 (в том числе кириллица) в результате эти символы будут представлены в виде кодов:

Отображение таких символов лечится очень просто — добавлением флага JSON_UNESCAPED_UNICODE вторым аргументом к функции json_encode:

Символы в других кодировках

Функция json_encode воспринимает строковые значения как строки в UTF8, что может вызвать ошибку, если кодировка другая. Рассмотрим маленький кусочек кода (данный пример кода максимально упрощен для демонстрации проблемной ситуации)

На первый взгляд ничего не предвещает проблем, да и что здесь может пойти не так? Я тоже так думал. В подавляющем большинстве случаев все будет работать, и по этой причине поиск проблемы занял у меня несколько больше времени, когда я впервые столкнулся с тем что результатом json_encode было false.

Как можно увидеть из ошибки: проблема с кодировкой переданной строки (это не UTF8). Решение проблемы очевидное — привести значение в UTF8

Цифровые значения

Последняя типовая ошибка связана с кодированием числовых значений.

Как известно php не строго типизированный язык и позволяет использовать числа в виде строки, в большинстве случаев это не приводит к ошибкам внутри php приложения. Но так как json очень часто используется для передачи сообщений между приложениями, такой формат записи числа может вызвать проблемы в другом приложении. Желательно использовать флаг JSON_NUMERIC_CHECK:

Уже лучше. Но как видим «3.0» превратилось в 3, что в большинстве случаев будет интерпретировано как int. Используем еще один флаг JSON_PRESERVE_ZERO_FRACTION для корректного преобразования в float:

Прошу также обратить внимание на следующий фрагмент кода, что иллюстрирует ряд возможных проблем с json_encode и числовыми значениями:

Спасибо за прочтение.

Буду рад увидеть в комментариях описание проблем, с которыми вы сталкивались, что не были упомянуты в статье

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *