2014-06-13 22 views
9

Stavo leggendo RFC 4627 e non riesco a capire se il seguente è JSON valido o meno. Considerate questo testo minimalista JSON:Sequenza di escape Unicode JSON - in minuscolo o no?

["\u005c"] 

Il problema è la minuscoloc.

Secondo il testo della RFC è ammesso:

Ogni personaggio può essere sfuggito. Se il carattere si trova nel piano multilingue (da U + 0000 a U + FFFF), potrebbe essere rappresentato come sequenza di sei caratteri: un solido solidale, seguito da con la lettera minuscola u seguita da quattro cifre esadecimali che codifichi il punto di codice del personaggio. Le lettere esadecimali A anche se F possono essere maiuscole o minuscole. Quindi, ad esempio, una stringa contenente un solo carattere di solidus inverso può essere rappresentata come "\ u005C".

(enfasi mia)

Il problema è che l'RFC contiene anche il grammatica per questo:

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 

dove HEXDIG è definito nella RFC riferimento 4234 come

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

che include solo lettere maiuscole.

FWIW, da quello che ho cercato la maggior parte dei parser JSON accetta lettere maiuscole e minuscole.

Domanda (e): Che cosa è effettivamente corretto? C'è una contraddizione e la grammatica nella RFC dovrebbe essere risolta?

risposta

10

Io penso è spiegato da questa parte della RFC 4234:

stringhe ABNF sono case-insensitive e il set di caratteri per queste stringhe è us-ascii.

Quindi:

rulename = "abc" 

e:

rulename = "aBc" 

corrisponderà "abc", "Abc", "abc", "ABC", "ABC", "ABC", "AbC "e " ABC ".

D'altra parte, la parte di follow-on non è molto chiaro:

Per specificare una regola che è case sensitive, specificare i caratteri singolarmente.

Ad esempio:

rulename = %d97 %d98 %d99 

o

rulename = %d97.98.99 

Nel caso della regola HEXDIG, sono singoli caratteri per cominciare - ma sono specificati letteralmente "A" ecc piuttosto che %d41, quindi I sospetto significa che non fanno distinzione tra maiuscole e minuscole. (Non è la specifica più chiara che ho letto :(

+0

Non si riferisce solo alla grammatica della scrittura di altre grammatiche? Voglio dire che "HEXDIG" e "heXdIG" devono essere usati in modo intercambiabile, ma sicuramente non possono fai riferimento a tutti i caratteri della grammatica come "A", altrimenti non puoi definire ** qualsiasi ** linguaggio sensibile al maiuscolo/minuscolo !? –

+0

@DanielFrey: Non penso - è una parte separata della RFC: " I nomi delle regole non fanno distinzione tra maiuscole e minuscole. "Concordo sul fatto che sia tutt'altro che chiaro. –

+0

+1 Ho scritto il primo commento prima della modifica. Con la modifica ha senso ora e sì, sono d'accordo non è la specifica più chiara :) –