8. String and Character Issues (字符串和字符问题)
8.1. Character Encoding (字符编码)
JSON文本应 (SHALL) 使用UTF-8、UTF-16或UTF-32编码。默认编码是UTF-8,以UTF-8编码的JSON文本是可互操作的,因为它们将被最大数量的实现成功读取;有许多实现无法成功读取其他编码(如UTF-16和UTF-32)的文本。
实现禁止 (MUST NOT) 在JSON文本的开头添加字节顺序标记 (Byte Order Mark, BOM)。为了互操作性,解析JSON文本的实现可以 (MAY) 忽略字节顺序标记的存在,而不是将其视为错误。
8.2. Unicode Characters (Unicode字符)
当JSON文本中表示的所有字符串完全由Unicode字符 [UNICODE](无论如何转义)组成时,该JSON文本是可互操作的,因为解析它的所有软件实现都会对对象和数组中名称和字符串值的内容达成一致。
然而,本规范中的ABNF允许成员名称和字符串值包含无法编码Unicode字符的位序列;例如,"\uDEAD"(单个未配对的UTF-16代理)。已观察到这种情况的实例,例如,当库截断UTF-16字符串而不检查截断是否分割了代理对时。接收包含此类值的JSON文本的软件行为是不可预测的;例如,实现可能返回字符串值长度的不同值,甚至遭受致命的运行时异常。
8.3. String Comparison (字符串比较)
软件实现通常需要测试对象成员名称的相等性。将文本表示转换为Unicode码元序列,然后逐个码元进行数值比较的实现是可互操作的,因为实现在所有情况下都会对两个字符串的相等或不相等达成一致。例如,无条件地比较带有转义字符的字符串的实现可能会错误地发现"a\\b"和"a\u005Cb"不相等。