Ответ 1
Спецификация JSON не требует преобразования из символов Unicode в escape-последовательности. "Любой символ UNICODE, кроме" или или управляющий символ ". Определен как допустимая строка, сериализованная JSON:
У меня есть простая тестовая страница в UTF-8, где текст с буквами на нескольких языках переводится в JSON:
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.
Спецификация JSON не требует преобразования из символов Unicode в escape-последовательности. "Любой символ UNICODE, кроме" или или управляющий символ ". Определен как допустимая строка, сериализованная JSON:
Короткий ответ на ваш вопрос: НЕТ; 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"
.
Нет. Предпочтительным кодированием для JSON является UTF-8, поэтому этим символам не требуется экранирование.
Вам разрешено избегать символов юникода, если вы хотите быть более безопасным или явно отправлять JSON в другую кодировку (то есть, чистый ASCII), но это противоречит рекомендациям.
Ваше утверждение просто неверно. Строки JSON состоят из кодовых точек unicode (кроме "" и "\" ), что все. Весь документ JSON может быть закодирован в UTF-8, UTF-16 или UTF-32 по усмотрению производителя. Кроме того, строки могут содержать escape-последовательности, которые предоставляют альтернативную форму именования кодовых точек, альтернативу их включению буквально.
Если различие между двумя все еще ускользает от вас, вот пример двух разных способов записи одной и той же строки в JSON:
"A"
"\u0041"
Обе версии представляют одну и ту же строку, состоящую из одиночной кодовой точки U + 41, которая A
.