JSON,Unicode:检测\uxxx中的XXXX与Unicode字符不对应的方法?

JSON,Unicode:检测\uxxx中的XXXX与Unicode字符不对应的方法?,json,unicode,escaping,character,non-unicode,Json,Unicode,Escaping,Character,Non Unicode,JSON规范规定可以使用以下符号对字符进行转义:\uxxx(其中XXXX是四个十六进制数字) 但是,并非每组四个十六进制数字都对应于Unicode字符 是否有工具可以扫描JSON文档以检测\uxxx的存在,其中XXXX不对应于任何Unicode字符?更一般地说,如何确定\uxxx不对应于任何Unicode字符?当JSON规范谈到Unicode字符时,它实际上意味着Unicode码点。每个有效的\uxxx序列都表示一个有效的码点,因为\uxxx可以表示高达U+FFFF的码点,但Unicode定义了

JSON规范规定可以使用以下符号对字符进行转义:\uxxx(其中XXXX是四个十六进制数字)

但是,并非每组四个十六进制数字都对应于Unicode字符


是否有工具可以扫描JSON文档以检测\uxxx的存在,其中XXXX不对应于任何Unicode字符?更一般地说,如何确定\uxxx不对应于任何Unicode字符?

当JSON规范谈到Unicode字符时,它实际上意味着Unicode码点。每个有效的
\uxxx
序列都表示一个有效的码点,因为
\uxxx
可以表示高达U+FFFF的码点,但Unicode定义了高达U+10FFFF的码点

当不使用转义十六进制表示法时,可以像在JSON中一样使用整个Unicode代码点范围。另一方面,当使用转义十六进制表示法时,只允许使用高达U+FFFF的代码点。但这是可以的,因为U+FFFF以上的代码点必须使用UTF-16代理项对来表示,该代理项对由两个代码点组成,这两个代码点都适合一起作用于
\uxxx
范围。这在以下章节中进行了描述:

任何字符都可以转义如果字符在基本字符中 多语言平面(U+0000到U+FFFF),则可能是 表示为六个字符的序列:一个反向索利多金币,后跟 由小写字母u,后跟四个十六进制数字 编码字符的代码点。十六进制字母A F可以是大写或小写。例如,一个字符串包含 只有一个反向索利多士字符可以表示为 “\u005C”

转义不在基本多语言中的扩展字符 平面,字符表示为12个字符的序列, 编码UTF-16代理项对。例如,一个字符串 仅包含G谱号字符(U+1D11E)的字符可以表示为 “\uD834\uDD1E”

因此,您的问题不应该是“是否
\uxxx
对应于Unicode字符?”,因为从逻辑上讲,它总是对应于Unicode字符,因为所有值0x0000-0xFFFF都是有效的Unicode码点。真正的问题应该是“是否
\uxxx
对应于BMP中的Unicode码点,如果不是,它是否属于对应于有效UTF-16代理的
\uxxx\uxxx
对?”