Я пишу веб-сервис, который использует 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. Влияет ли это на решение? Мне не хватает знаний о поддержке utf-8 в различных браузерах javascript.
РЕДАКТИРОВАТЬ: Я хотел уточнить, что моя основная забота о том, как кодировать результаты, на самом деле связана с обработкой результатов браузером. То, что я прочитал, указывает на то, что браузеры могут быть чувствительны к кодировке, в частности, при использовании JSONP. Я не нашел действительно хорошей информации по этому поводу, поэтому мне придется начать тестирование, чтобы увидеть, что произойдет. В идеале я хотел бы избежать только тех нескольких символов, которые требуются, и просто кодировать результаты utf-8.
источник
У меня там была проблема. Когда я JSON кодирую строку с таким символом, как «é», все браузеры будут возвращать то же «é», за исключением IE, который вернет «\ u00e9».
Затем с PHP json_decode () он не сработает, если найдет «é», поэтому для Firefox, Opera, Safari и Chrome я должен вызвать utf8_encode () перед json_decode ().
Примечание: в моих тестах IE и Firefox используют собственный объект JSON, другие браузеры используют json2.js.
источник
utf8_encode()
, php.net/manual/en/function.utf8-encode.phpASCII в нем больше нет. Использование кодировки UTF-8 означает, что вы не используете кодировку ASCII. В RFC говорится, что вам следует использовать механизм экранирования:
источник
Я столкнулся с той же проблемой. Меня устраивает. Пожалуйста, проверьте это.
json_encode($array,JSON_UNESCAPED_UNICODE);
источник
К вашему сведению, RFC 4627 больше не является официальной спецификацией JSON. Он был отменен в 2014 году в соответствии с RFC 7159 , который затем был отменен в 2017 году в соответствии с RFC 8259 , который является текущей спецификацией.
RFC 8259 гласит:
источник
У меня была аналогичная проблема с é char ... Я думаю, что комментарий «возможно, что текст, который вы вводите, не UTF-8», вероятно, близок к отметке здесь. У меня такое чувство, что сортировка по умолчанию в моем экземпляре была чем-то другим, пока я не понял и не изменил на utf8 ... проблема в том, что данные уже были там, поэтому не уверен, преобразовал ли он данные или нет, когда я их изменил, отлично отображается в mysql верстак. Конечным результатом является то, что php не будет кодировать данные json, а просто вернет false. Неважно, какой браузер вы используете в качестве сервера, вызывающего мою проблему, php не будет анализировать данные в utf8, если этот символ присутствует. Как я говорю, не уверен, связано ли это с преобразованием схемы в utf8 после того, как данные присутствовали, или просто с ошибкой php. В этом случае используйте
json_encode(utf8_encode($string));
источник