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.)