Zum Hauptinhalt springen

8. String and Character Issues (Zeichenketten- und Zeichenprobleme)

8.1. Character Encoding (Zeichenkodierung)

JSON-Text, der zwischen Systemen ausgetauscht wird, die nicht Teil eines geschlossenen Ökosystems sind, muss (MUST) mit UTF-8 [RFC3629] kodiert werden.

Frühere Spezifikationen von JSON haben die Verwendung von UTF-8 bei der Übertragung von JSON-Text nicht vorgeschrieben. Die überwiegende Mehrheit der JSON-basierten Softwareimplementierungen hat sich jedoch für die Verwendung der UTF-8-Kodierung entschieden, so dass sie die einzige Kodierung ist, die Interoperabilität erreicht.

Implementierungen dürfen (MUST NOT) einem über ein Netzwerk übertragenen JSON-Text keine Byte-Order-Markierung (Byte Order Mark, BOM, U+FEFF) voranstellen. Im Interesse der Interoperabilität können (MAY) Implementierungen, die JSON-Texte analysieren, das Vorhandensein einer Byte-Order-Markierung ignorieren, anstatt sie als Fehler zu behandeln.

8.2. Unicode Characters (Unicode-Zeichen)

Wenn alle in einem JSON-Text dargestellten Zeichenketten vollständig aus Unicode-Zeichen [UNICODE] (wie auch immer maskiert) bestehen, dann ist dieser JSON-Text in dem Sinne interoperabel, dass alle Softwareimplementierungen, die ihn analysieren, sich über den Inhalt von Namen und Zeichenkettenwerten in Objekten und Arrays einig sein werden.

Die ABNF in dieser Spezifikation erlaubt jedoch, dass Mitgliedsnamen und Zeichenkettenwerte Bitsequenzen enthalten, die keine Unicode-Zeichen kodieren können; zum Beispiel "\uDEAD" (ein einzelnes unpaariges UTF-16-Surrogat). Solche Fälle wurden beobachtet, wenn beispielsweise eine Bibliothek eine UTF-16-Zeichenkette abschneidet, ohne zu überprüfen, ob die Kürzung ein Surrogatpaar aufteilt. Das Verhalten von Software, die JSON-Texte mit solchen Werten empfängt, ist unvorhersehbar; Implementierungen können beispielsweise unterschiedliche Werte für die Länge einer Zeichenkette zurückgeben oder sogar fatale Laufzeitausnahmen erleiden.

8.3. String Comparison (Zeichenkettenvergleich)

Softwareimplementierungen müssen typischerweise die Namen von Objektmitgliedern auf Gleichheit testen. Implementierungen, die die Textdarstellung in Sequenzen von Unicode-Code-Einheiten umwandeln und dann den Vergleich numerisch, Code-Einheit für Code-Einheit, durchführen, sind in dem Sinne interoperabel, dass Implementierungen sich in allen Fällen über Gleichheit oder Ungleichheit zweier Zeichenketten einig sein werden. Implementierungen, die Zeichenketten mit unkonvertierten maskierten Zeichen vergleichen, können beispielsweise fälschlicherweise feststellen, dass "a\\b" und "a\u005Cb" nicht gleich sind.