JSON и экранирующие символы
У меня есть строка, которая сериализуется в JSON в Javascript, а затем десериализуется на Java.
Похоже, если строка содержит символ степени, тогда я получаю проблему.
Я мог бы использовать некоторую помощь в выяснении, кто виноват:
- это реализация Spidermonkey 1.8? (у этого есть встроенная реализация JSON)
- это Google gson?
- Это я за то, что не делаю что-то правильно?
Вот что происходит в JSDB:
js>s='15\u00f8C'
15°C
js>JSON.stringify(s)
"15°C"
Я бы ожидал "15\u00f8C'
, что заставляет меня поверить, что реализация JSON Spidermonkey не делает правильной вещи... кроме того, что синтаксис главной страницы JSON описание (это спецификация?) говорит, что char может быть
любой-Unicode, характе- кроме - "- или -\- или- контрольный символ"
поэтому, возможно, он передает строку вдоль as-is, не кодируя ее как \u00f8... в этом случае я бы подумал, что проблема связана с библиотекой gson.
Может ли кто-нибудь помочь?
Я полагаю, что мое обходное решение заключается в использовании либо другой библиотеки JSON, либо вручную удалении строк после вызова JSON.stringify()
, но если это ошибка, я хотел бы подать отчет об ошибке.
Ответы
Ответ 1
Это не ошибка в реализации. Нет необходимости избегать U + 00B0. Чтобы процитировать RFC:
2.5. Строки
Представление строк является аналогичные соглашениям, используемым в C семейство языков программирования. строка начинается и заканчивается цитатой Метки. Все символы Юникода могут быть помещены в кавычки за исключением символов, которые должны быть escaped: кавычка, обратная solidus и управляющие символы (U + 0000 через U + 001F).
Любой символ может быть экранирован.
Экранирование всего раздувает размер данных (все кодовые точки могут быть представлены в четырех или более байтах во всех форматах преобразования Юникода, тогда как их кодирование составляет шесть или двенадцать байтов).
Скорее всего, у вас есть ошибка перекодирования текста где-то в вашем коде, и экранирование всего в подмножестве ASCII маскирует проблему. Требование спецификации JSON заключается в том, что все данные используют кодировку Unicode.
Ответ 2
hmm, ну вот обходной путь:
function JSON_stringify(s, emit_unicode)
{
var json = JSON.stringify(s);
return emit_unicode ? json : json.replace(/[\u007f-\uffff]/g,
function(c) {
return '\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4);
}
);
}
тестовый пример:
js>s='15\u00f8C 3\u0111';
15°C 3◄
js>JSON_stringify(s, true)
"15°C 3◄"
js>JSON_stringify(s, false)
"15\u00f8C 3\u0111"