跳到主要内容

8. 字符串和字符问题

8.1. 字符编码

在不属于封闭生态系统的系统之间交换的 JSON 文本必须 (MUST) 使用 UTF-8 [RFC3629] 编码.

以前的 JSON 规范并未要求在传输 JSON 文本时使用 UTF-8. 但是, 绝大多数基于 JSON 的软件实现都选择使用 UTF-8 编码, 以至于它是唯一能实现互操作性的编码.

实现不得 (MUST NOT) 在通过网络传输的 JSON 文本开头添加字节序标记 (U+FEFF). 为了互操作性, 解析 JSON 文本的实现可以 (MAY) 忽略字节序标记的存在, 而不是将其视为错误.

8.2. Unicode 字符

当 JSON 文本中表示的所有字符串完全由 Unicode 字符 [UNICODE] 组成时 (无论如何转义), 该 JSON 文本就是可互操作的, 其含义是所有解析它的软件实现都会一致理解对象和数组中名称以及字符串值的内容.

但是, 本规范中的 ABNF 允许成员名称和字符串值包含无法编码 Unicode 字符的位序列; 例如 "\uDEAD" (单个未配对的 UTF-16 代理项). 已观察到这类实例, 例如某个库截断 UTF-16 字符串时未检查截断是否拆分了代理项对. 接收包含此类值的 JSON 文本的软件行为不可预测; 例如, 实现可能对字符串值长度返回不同值, 甚至遭遇致命运行时异常.

8.3. 字符串比较

软件实现通常需要测试对象成员名称是否相等. 如果实现将文本表示转换为 Unicode 码元序列, 然后逐个码元按数值执行比较, 则这类实现是可互操作的, 其含义是各实现会在所有情况下对两个字符串相等或不相等达成一致. 例如, 如果实现比较带转义字符的字符串时不进行转换, 可能会错误地认为 "a\\b""a\u005Cb" 不相等.