Кодировка символов JSON - поддерживается UTF-8 браузерами или мне нужно использовать числовые escape-последовательности?

Я пишу веб-сервис, который использует json для представления своих ресурсов, и я немного застрял в размышлении о наилучшем способе кодирования json. Чтение json rfc (http://www.ietf.org/rfc/rfc4627.txt) ясно, что предпочтительным кодированием является utf-8. Но rfc также описывает механизм экранирования строки для указания символов. Я предполагаю, что это, как правило, будет использоваться для выхода из символов, отличных от ascii, тем самым делая полученный utf-8 действительным ascii.

Итак, скажем, у меня есть строка json, которая содержит символы Unicode (кодовые точки), которые не являются ascii. Должен ли мой веб-сервис просто кодировать utf-8 и возвращать его, или он должен избегать всех этих символов без ascii и возвращать чистый ascii?

Я бы хотел, чтобы браузеры могли выполнять результаты с помощью jsonp или eval. Означает ли это решение? Мои знания о поддержке javascript в браузере для utf-8 отсутствуют.

EDIT: Я хотел уточнить, что моя основная забота о том, как закодировать результаты, действительно касается обработки браузером результатов. То, что я прочитал, указывает на то, что браузеры могут быть чувствительны к кодировке при использовании JSONP в частности. Я не нашел по-настоящему хорошей информации по этому вопросу, поэтому мне нужно будет начать какое-то тестирование, чтобы посмотреть, что произойдет. В идеале я бы хотел только избежать тех нескольких символов, которые требуются, и просто utf-8 закодировать результаты.

Ответ 1

Все партизаны JSON могут обрабатывать надлежащий UTF-8 так же, как и числовые escape-последовательности, как требует спецификация JSON.

Возможность для кодов JSON использовать числовые escape-последовательности вместо этого просто предлагает вам больше выбора. Одна из причин, по которой вы можете выбрать числовые escape-последовательности, будет заключаться в том, что механизм транспорта между вашим кодером и предполагаемым декодером не является безопасным для двоичных файлов.

Еще одна причина, по которой вы можете использовать числовые escape-последовательности, заключается в том, чтобы предотвратить появление определенных символов в потоке, таких как <, & и ", которые могут быть интерпретированы как последовательности HTML, если код JSON помещен без экранирования HTML или браузер неправильно интерпретирует его как HTML. Это может быть защита от встраивания HTML или межсайтового скриптинга (обратите внимание: некоторые символы ДОЛЖНЫ быть экранированы в JSON, включая " и \).

Некоторые фреймворки, включая реализацию JSON на PHP, всегда выполняют числовые escape-последовательности на стороне кодировщика для любого символа вне ASCII. Это предназначено для максимальной совместимости с ограниченными транспортными механизмами и т.п. Однако это не следует интерпретировать как указание на то, что JSON-декодеры имеют проблемы с UTF-8.

Итак, я думаю, вы могли бы решить, как использовать это:

  • Просто используйте UTF-8, если ваш метод хранения или транспорта между кодировщиком и декодером не является двоичным.

  • В противном случае используйте числовые escape-последовательности.

Ответ 2

У меня была проблема. Когда я JSON кодирую строку с символом типа "é" , каждый браузер возвращает тот же "é" , кроме IE, который вернет "\ u00e9".

Затем с PHP json_decode() он будет терпеть неудачу, если найдет "é" , поэтому для Firefox, Opera, Safari и Chrome я должен вызвать utf8_encode() перед json_decode().

Примечание. В моих тестах IE и Firefox используют свой собственный объект JSON, другие браузеры используют json2.js.

Ответ 3

ASCII больше в нем нет. Использование кодировки UTF-8 означает, что вы не используете кодировку ASCII. Что вы должны использовать для механизма экранирования, это то, что RFC говорит:

Все символы Юникода могут быть размещены в кавычках, кроме для символов, которые должны быть escaped: кавычка, обратная solidus и управляющие символы (U + 0000 через U + 001F)

Ответ 4

У меня была та же проблема. Меня устраивает. Пожалуйста, проверьте это.

json_encode($array,JSON_UNESCAPED_UNICODE);

Ответ 5

У меня была аналогичная проблема с é char... Я думаю, комментарий, "возможно, что текст, который вы его кормите, не UTF-8", вероятно, близок к знаку здесь. Я чувствую, что сортировка по умолчанию в моем экземпляре была чем-то еще до тех пор, пока я не понял и не изменил ее на utf8... проблема в том, что данные уже были там, поэтому не уверен, что он преобразовал данные или нет, когда я его изменил, верстак. Конечным результатом является то, что php не будет кодировать данные json, просто возвращает false. Неважно, какой браузер вы используете в качестве своего сервера, вызывающего мою проблему, php не будет анализировать данные в utf8, если этот char присутствует. Например, я не уверен, что это связано с преобразованием схемы в utf8 после присутствия данных или просто с ошибкой php. В этом случае используйте json_encode(utf8_encode($string));