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

Кодирование JSON в UTF-16 или UTF-32

JSON RFC, раздел 2.5, в частности:

Чтобы избежать расширенного символа, который отсутствует в Basic Multilingual Плоскость, символ представлен в виде двенадцатисимвольной последовательности, кодируя суррогатную пару UTF-16. Так, например, строка содержащий только символ ключа G (U + 1D11E), может быть представлен как "\ UD834\uDD1E".

Предположим, что у меня есть веская причина для кодирования JSON как UTF-16BE (что разрешено). При этом все же необходимо избегать символов, которые не находятся в базовой многоязычной плоскости? Например, вместо этого:

00 5C 00 75 00 44 00 38 00 33 00 34 00 5C 00 75 00 44 00 44 00 31 00 45
  \     u     D     8     3     4     \     u     D     D     1     E

который является 24-байтовой последовательностью байтов UTF-16BE для \uD834\uDD1E, законно ли это сделать:

D8 34 DD 1E

i.e, используйте 4-байтовые значения UTF-16BE напрямую?

Аналогично, если бы я должен был кодировать ту же строку JSON, что и UTF-32BE, могу ли я просто напрямую использовать значение кодовой точки:

00 01 D1 1E

?

4b9b3361

Ответ 1

Насколько я могу судить, да, вы можете напрямую писать значения UTF-16. Поддержка: в приведенном вами параде RFC объясняется, как избежать произвольного Юникода, если вы решили его избежать. Однако ранее в этом же разделе RFC сообщает

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

Любой символ может быть экранированным. Если символ находится в Базовый многоязычный самолет (U + 0000 через U + FFFF), то это может быть представленный в виде шестисимвольной последовательности...

(Акцент добавлен.)

Для меня это говорит о том, что только ", \ и управляющие символы должны быть экранированы и что любые другие символы Unicode могут помещаться как-есть непосредственно в текст JSON (в любой форме UTF, которую вы используете). Он также говорит мне, что даже если вы кодируете UTF-8, вам не нужно использовать форму \uXXXX для любого символа Юникода, отличного от ", \ и управляющих символов.

(Как в стороне, это меня заставляет задуматься, действительно ли форма \uXXXX полезна для чего-либо, кроме управляющих символов. Как сказал другой плакат, вероятно, это связано с тем, что фактически поддерживает парсер JSON.)