В спецификации JSON, что означает «Поскольку первые два символа текста JSON всегда будут символами ASCII»? - PullRequest
5 голосов
/ 20 ноября 2010

RFC 4627 для Json читает:

  1. Кодировка

    Текст JSON ДОЛЖЕН быть закодирован в Unicode.Кодировка по умолчанию - UTF-8.

    Поскольку первые два символа текста JSON всегда будут символами ASCII [RFC0020], можно определить, является ли поток октетов UTF-8, UTF-16 (BE или LE) или UTF-32 (BE или LE), взглянув на шаблон нулей в первых четырех октетах.

Что это значит "Поскольку первые два символатекст JSON всегда будет символами ASCII [RFC0020] "?Я посмотрел на RFC0020, но ничего не смог найти.JSON может быть {"или {" (т.е. пробел перед кавычкой.

Ответы [ 2 ]

7 голосов
/ 20 ноября 2010

Это означает, что, поскольку JSON всегда будет начинаться с символов ASCII (не-ASCII разрешен только в строках, которые не могут быть корневым объектом), можно с самого начала потока / файла определить, в какой кодировке он находится..

UTF-16 и UTF-32 должны иметь BOM , которая появляется в начале потока, и, выяснив, что это такое, вы можете определить точное кодирование.Это возможно, так как можно определить, являются ли первые символы JSON или нет.

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

1 голос
/ 02 сентября 2018

RFC 4627 требует документ JSON для представления объекта или массива.Итак, первые символы должны быть (с любым количеством пробельных символов JSON) [, за которым следует значение или {, за которым следует ".Значения: null, true, false или строка ("…), объект или массив.Итак, поскольку пробельные символы JSON, [, {, n, t, f и " находятся в блоке C0 Controls и Basic Latin * , они такжев наборе символов ASCII [разработкой Unicode].(Не уверен, почему стандарт фиксируется на «ASCII», когда он говорит: «Текст JSON ДОЛЖЕН быть закодирован в Unicode.» В будущих стандартах ссылка будет опущена.)

UTF-32 имеет четыре байта на символ.У UTF-16 есть два.Итак, чтобы различать UTF-16 и UTF-32, вам нужно 4 байта.В обоих этих кодировках символы из блока C0 Controls и Basic Latin * кодируются не более чем одним ненулевым байтом (байт со значением 0 иногда называют «нулевым байтом»).Кроме того, U + 0000 (который кодируется как 0x00 0x00 0x00 0x00 в UTF-32 и 0x00 0x00 в UTF-16) не является допустимым пробелом JSON.Таким образом, шаблон размером 0x00 байтов можно использовать для определения того, какую из допустимых кодировок использует действительный документ JSON.

RFC 7159 изменил JSON, чтобы позволить документу JSON представлять любое значение,не просто объект или массив.Таким образом, утверждение в предыдущем стандарте больше не действует.Поэтому алгоритм обнаружения символов был нарушен и удален из стандарта.

Для точного обнаружения необходимо увидеть начало и конец документа.0x22 0x00 0x00 0x00 в начале может быть любым из UTF-8, UTF-16LE и UTF-32LE;Это начало строки с нулем или более символов U + 0000.В этом случае вам понадобится число 0x00 байтов в конце, чтобы указать, какие.

RFC 8259 изменил JSON, чтобы требовать UTF-8 (для JSON), которым обмениваются системы, которые не являются частьюзамкнутой экосистемы ").Практически, считыватель JSON по-прежнему принимает UTF-16 и UTF-32.

В конце некоторые популярные парсеры JSON оставляют декодирование символов вызывающей стороне, имея API, которые принимают только «родной» тип строки для среды программирования.(Это открывает очень распространенную опасность использования неправильной кодировки символов для чтения текстовых файлов или тел HTTP.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...