8. String and Character Issues (字符串和字符问题)
8.1. Character Encoding (字符编码)
JSON文本必须 (MUST) 使用UTF-8 [RFC3629] 编码。
之前的JSON规范在传输JSON文本时并未要求使用UTF-8。然而,绝大多数基于JSON的软件实现都选择使用UTF-8编码,以至于它是唯一能实现互操作性的编码。
实现不得 (MUST NOT) 在JSON文本的开头添加字节顺序标记 (Byte Order Mark, BOM, U+FEFF)。为了实现互操作性,解析JSON文本的实现可以 (MAY) 忽略开头的BOM,而不是将其视为错误。
8.2. Unicode Characters (Unicode字符)
当引用控制字符的Unicode字符值时,本规范使用Unicode约定 "U+" 后跟十六进制字符代码点值。例如,"U+0022"表示引号字符。
当JSON文本中表示的所有字符串完全由Unicode字符 [UNICODE](无论如何转义)组成时,该JSON文本在互操作性方面是可行的,因为所有解析它的软件实现都将同意对象和数组中名称和字符串值的内容。
然而,本规范中的ABNF允许成员名称和字符串值包含无法编码Unicode字符的位序列;例如,"\uDEAD"(单个未配对的UTF-16代理)。已观察到这种情况的实例,例如,当库截断UTF-16字符串而不检查截断是否拆分了代理对时。接收包含此类值的JSON文本的软件行为是不可预测的;例如,实现可能会为字符串值的长度返回不同的值,甚至遭受致命的运行时异常。
8.3. String Comparison (字符串比较)
软件实现通常需要测试对象成员的名称是否相等。将文本表示转换为Unicode代码单元序列,然后逐个代码单元进行数值比较的实现在互操作性方面是可行的,因为实现将在所有情况下就两个字符串的相等或不相等达成一致。例如,无条件比较带有转义字符的字符串的实现可能会错误地发现 "a\\b" 和 "a\u005Cb" 不相等。