Подтвердить что ты не робот

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(), но если это ошибка, я хотел бы подать отчет об ошибке.

4b9b3361

Ответ 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"