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). 出于互操作性考虑, 解析 JSON 文本的实现 MAY 忽略字节顺序标记的存在, 而不是将其视为错误.
8.2. Unicode Characters (Unicode字符)
当 JSON 文本中表示的所有字符串都完全由 Unicode 字符 [UNICODE] 组成时 (无论采用何种转义方式), 该 JSON 文本具有互操作性, 因为解析它的所有软件实现都会就对象和数组中名称与字符串值 (string value) 的内容达成一致.
然而, 本规范中的 ABNF 允许成员名称 (member name) 和字符串值包含无法编码 Unicode 字符的位序列 (bit sequence); 例如, "\uDEAD" (单个未配对的 UTF-16 surrogate). 已经观察到此类实例, 例如某个库截断 UTF-16 字符串时没有检查截断位置是否拆开了代理对. 接收包含此类值的 JSON 文本的软件行为是不可预测的; 例如, 实现可能对字符串值的长度返回不同值, 甚至遭遇致命的运行时异常.
8.3. String Comparison (字符串比较)
软件实现通常需要测试对象成员的名称是否相等. 将文本表示转换为 Unicode 码元 (code unit) 序列, 然后按码元逐个进行数值比较的实现具有互操作性, 因为实现会在所有情况下就两个字符串相等或不相等达成一致. 例如, 对带有转义字符但未进行转换的字符串直接比较的实现, 可能会错误地认为 "a\b" 和 "a\u005Cb" 不相等.