JSON и экранирующие символы - PullRequest
50 голосов
/ 04 февраля 2011

У меня есть строка, которая сериализуется в 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 (это спецификация?) Говорит что символ может быть

любой-Unicode, характери- кроме - "- или - \ - или- управляющий символ "

так что, возможно, она передает строку как есть, не кодируя ее как \ u00f8 ... в этом случае я думаю, что проблема в библиотеке gson.

Может кто-нибудь помочь?

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

Ответы [ 2 ]

70 голосов
/ 05 февраля 2011

Это не ошибка ни в одной из реализаций.Нет требования убежать от U + 00B0.Процитирую RFC :

2.5.Строки

Представление строк аналогично соглашениям, используемым в семействе языков программирования C.Строка начинается и заканчивается кавычками.Все символы Юникода могут быть помещены в кавычки, кроме символов, которые должны быть экранированы: кавычка, обратный солидус и управляющие символы (от U + 0000 до U + 001F).

Любой символ может быть экранированным.

Исключение всего, что приводит к увеличению размера данных (все кодовые точки могут быть представлены четырьмя или менее байтами во всех форматах преобразования Unicode; тогда как при кодировании их все получается шесть илидвенадцать байтов).

Скорее всего, у вас есть ошибка с перекодировкой текста где-то в вашем коде, и экранирование всего в подмножестве ASCII маскирует проблему.В спецификации JSON требуется, чтобы все данные использовали кодировку Unicode.

70 голосов
/ 04 февраля 2011

хм, ну вот обходной путь в любом случае:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...