Подтвердить что ты не робот

Различия в JSON.stringify результате между браузерами

Когда я JSON.stringify() следующий код:

var exampleObject = { "name" : "Žiga Kovač", "kraj" : "Žužemberk"};

Я получаю разные результаты между браузерами.

IE8 и возврат в Google Chrome:

{"name":"\u017diga Kova\u010d","kraj":"\u017du\u017eemberk"}

Пока Firefox и Opera возвращаются:

{"name":"Žiga Kovač","kraj":"Žužemberk"}

Я использую встроенную версию JSON для браузера во всех 4 браузерах. Если я откажу в определении собственной реализации JSON и замените ее на json.org, то все браузеры вернутся:

{"name":"Žiga Kovač","kraj":"Žužemberk"}

Почему это происходит, результат правильный, и можно ли вернуть все браузеры:

{"name":"\u017diga Kova\u010d","kraj":"\u017du\u017eemberk"}

?

4b9b3361

Ответ 1

Эти два представления абсолютно эквивалентны.

Один использует escape-последовательности Unicode (\uxxxx) для представления символа Unicode, а другой использует символ Unicode. json.org определяет строку как:

string
    - ""
    - "chars"
chars
    - char
    - char chars
char
    - any Unicode character except " or \ or control characters
    - one of: \" \\ \/ \b \f \n \r \t
    - \u four-hex-digits

Нет никакой разницы в самих строках, только в их представлении. Это то же самое, что делает HTML, когда вы используете ©, © или © для представления знака авторского права.

Ответ 2

"Правильная" (видимо) версия - это строка UTF8, а экранированная строка - это строка ASCII с кодами выхода UTF8. В то время как первый может быть использован в теле HTTP (пока кодирование содержимого установлено в UTF8), второй может также использоваться в заголовке запроса HTTP GET.

Если вы хотите использовать версию UTF8 в запросе GET, вам сначала нужно избежать ее, используя encodeURIComponent.

Когда контент получен на стороне сервера, встроенная реализация строки будет обеспечивать, чтобы она содержала точно такие же данные (от всех клиентов) при условии, что передача HTTP верна.

Ваш браузер, как правило, обрабатывает его кодировку, если вы отправляете его как тело HTTP POST.

Ответ 3

Оба результата правильны, если ваш первый пример закодирован в UTF-8.

например.\u017d ist просто другое обозначение Ž (017d - позиция в кодировке UTF8)

Ответ 4

Они все правильные. Некоторые возвращают его в кодировке UTF-8, а некоторые - в ASCII.