Escape-последовательность JSON Unicode-строчная или нет?

Я читал RFC 4627, и я не могу понять, действительно ли следующее JSON или нет. Рассмотрим этот минималистичный текст JSON:

["u005c"]

проблема строчные c.

по словам текст из RFC допускается:

любой символ может быть сбежал. Если персонаж находится в Basic Многоязычная плоскость (U+0000 через U+FFFF), тогда она может быть представлен в виде шестизначной последовательности: a обратный Солидус, а затем строчной буквой u, за которой следуют четыре шестнадцатеричные цифры, закодировать код персонажа. шестнадцатеричные буквы A, хотя F может быть верхний или нижний регистр. так, например, строка, содержащая только один обратный символ solidus может быть представлен как "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

здесь HEXDIG определяется в ссылочном RFC 4234 как

HEXDIG         =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"

которых включает только прописные буквы.

FWIW, из того, что я исследовал, большинство парсеров JSON принимают как верхние, так и строчные буквы.

вопрос(ы): что на самом деле правильно? Есть ли противоречие, и грамматика в RFC должна быть исправлена?

1 ответов


Я думаю это объясняется этой частью RFC 4234:

строки ABNF нечувствительны к регистру, и набор символов для этих строк-us-ascii.

отсюда:

    rulename = "abc"

и:

    rulename = "aBc"

будет соответствовать "abc", "Abc", "aBc", "abC", "ABc", "aBC", "AbC", и "АЗБУКА."

С другой стороны, последующая часть не очень ясна:

указать правило, учитывающее регистр, указывает символы по отдельности.

например:

    rulename    =  %d97 %d98 %d99

или

    rulename    =  %d97.98.99

в случае HEXDIG правило, они являются отдельными символами для начала , но они указаны буквально как "A" etc, а не %d41, Я подозреваемый это означает, что они чувствительны к регистру. Это не самая ясная спецификация, которую я читал : (