2014-06-13 4 views
9

Ich las RFC 4627 und ich kann nicht herausfinden, ob das folgende JSON gültig ist oder nicht. Betrachten Sie diesen minimalistischen JSON Text:JSON Unicode-Escape-Sequenz - Kleinbuchstaben oder nicht?

["\u005c"] 

Das Problem ist die Kleinc.

Nach dem Text des RFC es erlaubt ist:

Jedes Zeichen maskiert werden kann. Befindet sich das Zeichen in der Mehrsprachigkeitsebene (U + 0000 bis U + FFFF), kann es als sechsstellige Zeichenfolge dargestellt werden: ein umgekehrter Solidus, gefolgt von mit dem Kleinbuchstaben u gefolgt von vier Hexadezimalziffern dass den Codepunkt des Zeichens codieren. Die hexadezimalen Buchstaben A bis F können Groß- oder Kleinbuchstaben sein. So kann z. B. eine Zeichenfolge, die nur ein einzelnes Reverse Solidus-Zeichen enthält, als "\ u005C" dargestellt werden.

(Hervorhebung von mir)

Das Problem ist, dass der RFC enthält auch die Grammatik hierfür:

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 

wo HEXDIG in referenzierten RFC 4234 als

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

enthält nur Großbuchstaben.

FWIW, von dem, was ich erforschte die meisten JSON-Parser akzeptieren Groß- und Kleinbuchstaben.

Frage (n): Was ist eigentlich richtig? Gibt es einen Widerspruch und die Grammatik im RFC sollte behoben werden?

Antwort

10

ich denke, es ist von diesem Teil von RFC 4234 erklärt hat:

ABNF Strings sind Groß- und Kleinschreibung und der Zeichensatz für diese Strings ist us-ascii.

Daraus folgt:

rulename = "abc" 

und:

rulename = "aBc" 

passt auf "abc", "Abc", "ABC", "ABC", "ABC", "ABC", „AbC ", und " ABC ".

Auf der anderen Seite, der Follow-on-Teil ist nicht sehr klar:

eine Regel zu spezifizieren, die Groß- und Kleinschreibung, individuell die Zeichen angeben.

Zum Beispiel:

rulename = %d97 %d98 %d99 

oder

rulename = %d97.98.99 

Im Falle der HEXDIG sie in der Regel sind einzelne Zeichen mit zu beginnen - aber sie sind angegeben wahrsten Sinne des Wortes als "A" etc eher als %d41, so dass ich verdächtige das heißt, sie sind case-insensitive. Es ist nicht die klarste Spezifikation, die ich gelesen habe :(

+0

Bezieht sich das nicht nur auf die Grammatik des Schreibens anderer Grammatiken? Ich meine, es erlaubt 'HEXDIG' und' heXdIG' austauschbar verwendet werden, aber das kann sicherlich nicht beziehen sich auf alle Zeichen in der Grammatik wie "A" 'sonst könnten Sie ** keine ** Groß-und Kleinschreibung Sprache definieren !? –

+0

@DanielFrey: Ich glaube nicht, das ist ein separater Teil des RFC:" Regelnamen sind case-insensitive ". Ich stimme zu, dass es noch nicht klar ist. –

+0

+1 Ich schrieb den ersten Kommentar vor Ihrer Bearbeitung. Mit der Bearbeitung macht es jetzt Sinn und ja, ich stimme zu, es ist nicht die klarste Spezifikation :) –