JSON字符串中的控制字符

7

JSON规范指出,必须转义的控制字符仅限于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文档或消息打印到终端或纸张上时,不损坏输出。

但是还有其他控制字符,比如来自C0的[DEL]和来自C1集合(U+0080到U+009F)的其他控制字符。它们在JSON字符串中也应该被转义吗?

1个回答

2

根据JSON规范:

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在英语环境之外会非常低效。

对于使用C1(甚至C0)控制字符的内容,UTF-16和UTF-32不可能被解析,因此对于这些编码来说,这一点并不重要。


1
转换与字符集编码无关,而与语法有关。一个String(一旦使用字符编码解码并取消转义)可以具有任何有限的UTF-16代码单元序列(这就是String的含义),而与文件编码无关。 - Tom Blodget
@TomBlodget 两者之间是相互关联的,因为转义和编码都会影响用于表示JSON字符串的字节。实际使用C1控件的大多数系统要么根本无法处理UTF,要么使用以ESC字节开头的多代码点表示。因此,JSON以UTF格式编码的事实意味着它可以在可能不关心JSON字符串中出现C1代码点的系统上运行。 - Rick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接