Не следует ли JSON.stringify удалять символы Unicode?

У меня есть простая тестовая страница в UTF-8, где текст с буквами на нескольких языках переводится в JSON:

http://jsfiddle.net/Mhgy5/

HTML:

<textarea id="txt">
検索 • Busca • Sök • 搜尋 • Tìm kiếm • Пошук • Cerca • Søk • Haku • Hledání • Keresés • 찾기 • Cari • Ara • جستجو • Căutare • بحث • Hľadať • Søg • Serĉu • Претрага • Paieška • Poišči • Cari • חיפוש • Търсене • Іздеу • Bilatu • Suk • Bilnga • Traži • खोजें
</textarea>
<button id="encode">Encode</button>
<pre id="out">
</pre>

JavaScript:

​$("#encode").click(function () {
    $("#out").text(JSON.stringify({ txt: $("#txt").val() }));
}).click();
​

Пока я ожидаю, что символы, отличные от ASCII, будут экранированы как \uXXXX в соответствии с спецификацией JSON, они кажутся нетронутыми. Здесь вывод, который я получаю из вышеприведенного теста:

{"txt":"検索 • Busca • Sök • 搜尋 • Tìm kiếm • Пошук • Cerca • Søk • Haku • Hledání • Keresés • 찾기 • Cari • Ara • جستجو • Căutare • بحث • Hľadať • Søg • Serĉu • Претрага • Paieška • Poišči • Cari • חיפוש • Търсене • Іздеу • Bilatu • Suk • Bilnga • Traži • खोजें\n"}

Я использую Chrome, поэтому это должна быть встроенная реализация JSON.stringify. Кодировка страницы - UTF-8. Не следует ли избегать символов, отличных от ASCII?

Что привело меня к этому тесту, в первую очередь, я заметил, что jQuery.ajax, похоже, не пропускает символы, отличные от ASCII, когда они появляются в свойстве объекта данных. Кажется, что символы передаются как UTF-8.

Ответ 1

Спецификация JSON не требует преобразования из символов Unicode в escape-последовательности. "Любой символ UNICODE, кроме" или или управляющий символ ". Определен как допустимая строка, сериализованная JSON:

json string format

Ответ 2

Короткий ответ на ваш вопрос: НЕТ; JSON.stringify не должен покидать вашу строку.

Хотя обработка строк utf8 может показаться странной, если вы сохраните свой HTML файл с кодировкой utf-8, но не объявляете его файлом utf8.

Например:

<!doctype html>
<html>
    <head>
        <title></title>
        <script>
            var data="árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP";
            alert(JSON.stringify(data));
        </script>
    </head>
</html>

Это будет предупреждать "árvíztűrÅ‘ tükörfúrógép ÃRVÃZTÅ°RÅ TÃœKÖRFÚRÃ"GÉP".

Но если вы добавите следующую строку в заголовок:

<meta charset="UTF-8">

Затем появится предупреждение, которое можно было бы ожидать: "árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP".

Ответ 3

Нет. Предпочтительным кодированием для JSON является UTF-8, поэтому этим символам не требуется экранирование.

Вам разрешено избегать символов юникода, если вы хотите быть более безопасным или явно отправлять JSON в другую кодировку (то есть, чистый ASCII), но это противоречит рекомендациям.

Ответ 4

Ваше утверждение просто неверно. Строки JSON состоят из кодовых точек unicode (кроме "" и "\" ), что все. Весь документ JSON может быть закодирован в UTF-8, UTF-16 или UTF-32 по усмотрению производителя. Кроме того, строки могут содержать escape-последовательности, которые предоставляют альтернативную форму именования кодовых точек, альтернативу их включению буквально.

Если различие между двумя все еще ускользает от вас, вот пример двух разных способов записи одной и той же строки в JSON:

  • "A"

  • "\u0041"

Обе версии представляют одну и ту же строку, состоящую из одиночной кодовой точки U + 41, которая A.