Различия в результатах JSON.stringify между браузерами - PullRequest
12 голосов
/ 05 октября 2010

Когда я 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"}

?

Ответы [ 4 ]

12 голосов
/ 05 октября 2010

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

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

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

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

7 голосов
/ 05 октября 2010

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

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

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

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

4 голосов
/ 05 октября 2010

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

Например, \ u017d - это просто еще одна нотация Ž (017d - это позиция в кодировке UTF8)

1 голос
/ 05 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...