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


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

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

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

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

5 73

5 ответов:

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

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

еще одна причина, по которой вы можете числовые escape-последовательности не допускайте появления в потоке определенных символов, таких как <,& и ", который может быть интерпретирован как последовательности HTML, если код JSON помещается без экранирования в HTML или браузер ошибочно интерпретирует его как HTML. Это может быть защита от инъекций HTML или межсайтовых сценариев (Примечание: некоторые символы должны быть экранированы в JSON, включая " и \).

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

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

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

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

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

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

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

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

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

я столкнулся с той же проблемой. Это работает на меня. Пожалуйста, проверьте это.

json_encode($array,JSON_UNESCAPED_UNICODE);

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