2010-10-05 3 views
12

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

?

+0

Связанный: http://stackoverflow.com/questions/3550094/unicode-characters-from-json-stringify-to-real-unicode-characters –

ответ

12

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

Один использует 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, когда вы используете ©, © или ©, чтобы представить знак авторского права.

+0

Как преобразовать символы не-ascii в JSON из Firefox и Opera в \ ихххх? Мне нужно именно это. – Matic

+0

@Matic: Я не понимаю, для чего вам это нужно? В конце концов, это одно и то же.Если у вас возникли проблемы с отправкой этих данных по проводке с помощью '' Ž "' вместо '' \ u017d'', вы должны настроить заголовки Content-Type только на UTF-8. – Tomalak

1

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

4

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

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

7

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

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

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

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

+1

Это ['encodeURIComponent'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURIComponent) –

+0

да, это ... :) –

Смежные вопросы