JSON Unicode转义序列 - 小写与否?

Dan*_*rey 9 unicode json rfc language-lawyer

我正在阅读RFC 4627,我无法弄清楚以下是否是有效的JSON.考虑这个简约的JSON文本:

["\u005c"]
Run Code Online (Sandbox Code Playgroud)

问题是小写 c.

根据RFC 的文本,允许:

任何角色都可能被转义.如果字符在基本多语言平面(U + 0000到U + FFFF)中,那么它可以表示为六个字符的序列:反向固相,后跟小写字母u,后跟四个十六进制数字,编码角色的代码点. 十六进制字母A到F可以是大写或小写. 因此,例如,仅包含单个反向固相字符的字符串可以表示为"\ u005C".

(强调我的)

问题是RFC还包含以下语法:

char = unescaped /
       escape (
           %x22 /          ; "    quotation mark  U+0022
           %x5C /          ; \    reverse solidus U+005C
           %x2F /          ; /    solidus         U+002F
           %x62 /          ; b    backspace       U+0008
           %x66 /          ; f    form feed       U+000C
           %x6E /          ; n    line feed       U+000A
           %x72 /          ; r    carriage return U+000D
           %x74 /          ; t    tab             U+0009
           %x75 4HEXDIG )  ; uXXXX                U+XXXX
Run Code Online (Sandbox Code Playgroud)

where HEXDIG在引用的RFC 4234中定义为

HEXDIG         =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
Run Code Online (Sandbox Code Playgroud)

其中只包含大写字母.

FWIW,从我研究的大多数JSON解析器接受大写和小写字母.

问题:什么是正确的?是否存在矛盾,RFC中的语法应该修复?

Jon*_*eet 10

认为这是RFC 4234的这一部分解释的:

ABNF字符串不区分大小写,这些字符串的字符集是us-ascii.

因此:

    rulename = "abc"
Run Code Online (Sandbox Code Playgroud)

和:

    rulename = "aBc"
Run Code Online (Sandbox Code Playgroud)

将匹配"abc","abc","aBc","abC","ABc","aBC","AbC"和"ABC".

另一方面,后续部分并不十分清楚:

要指定IS SENSITIVE的规则,请单独指定字符.

例如:

    rulename    =  %d97 %d98 %d99
Run Code Online (Sandbox Code Playgroud)

要么

    rulename    =  %d97.98.99
Run Code Online (Sandbox Code Playgroud)

HEXDIG规则的情况下,它们是单个字符开始 - 但它们被字面指定为"A"等而不是%d41,所以我怀疑这意味着它们不区分大小写.这不是我读过的最清晰的规范:(