JSON specification指出必须转义的控制字符仅使用从U + 0000到U + 001F的代码:

7.  Strings

   The representation of strings is similar to conventions used in the C
   family of programming languages.  A string begins and ends with
   quotation marks.  All Unicode characters may be placed within the
   quotation marks, except for the characters that must be escaped:
   quotation mark, reverse solidus, and the control characters (U+0000
   through U+001F).

转义的主要思想是在终端或纸上打印JSON文档或消息时不损坏输出。

但是还有其他控制字符,例如[DEL] from C0 and other control characters from C1 set (U+0080 through U+009F)。难道它们也不也以JSON字符串转义吗?

最佳答案

JSON specification:

8.  String and Character Issues

8.1.  Character Encoding

   JSON text SHALL be encoded in UTF-8, UTF-16, or UTF-32.

在UTF-8中,高于127的所有代码点都被编码为多个字节。这些字节中的大约一半在C1控制字符范围内。因此,为了避免在UTF-8编码的JSON字符串中包含这些字节,将需要转义所有这些代码点。这有效地消除了UTF-8的使用,并且JSON字符串也可能以ASCII编码。由于ASCII是UTF-8的子集,因此标准不允许这样做。因此,如果您担心将C1控制字符放入字节流中,则只需将它们转义即可,但要求每个JSON表示形式使用ASCII在除英语环境之外的任何情况下都效率极低。

UTF-16和UTF-32可能无法通过使用C1(甚至C0)控制字符的内容进行解析,因此对于那些编码而言,这一点相当无聊。

10-01 06:47
查看更多