JSON 规范说可以使用以下符号转义字符:\uXXXX(其中 XXXX 是四个十六进制数字)
但是,并不是每组四个十六进制数字都对应一个 Unicode 字符。
是否有工具可以扫描 JSON 文档以检测 \uXXXX 的存在,其中 XXXX 不对应任何 Unicode 字符?更一般地说,如何确定 \uXXXX 不对应于任何 Unicode 字符?
JSON 规范说可以使用以下符号转义字符:\uXXXX(其中 XXXX 是四个十六进制数字)
但是,并不是每组四个十六进制数字都对应一个 Unicode 字符。
是否有工具可以扫描 JSON 文档以检测 \uXXXX 的存在,其中 XXXX 不对应任何 Unicode 字符?更一般地说,如何确定 \uXXXX 不对应于任何 Unicode 字符?
当 JSON 规范谈到 Unicode字符时,它实际上是指 Unicode代码点。每个有效 \uXXXX
的序列都代表一个有效的代码点,因为它可以表示高达 U+FFFF 的代码点,但 Unicode 定义的代码点一直到 U+10FFFF 。\uXXXX
当不使用转义的十六进制表示法时,可以在 JSON 中按原样使用所有 Unicode 代码点。另一方面,当使用转义的十六进制表示法时,只允许高达 U+FFFF 的代码点。但这没关系,因为高于 U+FFFF 的代码点必须使用 UTF-16 代理对表示,它由两个代码点组成,它们都适合\uXXXX
共同作用的范围。这在RFC 7159 第 7 节字符串中有描述:
任何字符都可以转义。 如果字符在基本多语言平面(U+0000 到 U+FFFF),那么它可以表示为一个六字符序列:一个反斜线,后跟小写字母 u,后跟四个十六进制数字, 编码字符的代码点。十六进制字母 A 到 F 可以是大写或小写。因此,例如,一个只包含一个反斜线字符的字符串可以表示为“\u005C”。
...
要转义不在 Basic Multilingual Plane 中的扩展字符,该字符表示为 12 字符序列, 编码 UTF-16 代理对。因此,例如,仅包含 G 谱号字符 (U+1D11E) 的字符串可以表示为“\uD834\uDD1E”。
所以你的问题不应该是“是否\uXXXX
对应于 Unicode 字符?”,因为它在逻辑上总是会因为所有值 0x0000 - 0xFFFF 都是有效的 Unicode 代码点。真正的问题应该是“确实对应于 BMP 中\uXXXX
的 Unicode 代码点,如果不是,它是否属于对应于有效UTF-16 代理项的对?”。\uXXXX\uXXXX