Zum Hauptinhalt springen

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

8.1. Character Encoding (Zeichenkodierung)

JSON-Text SHALL mit UTF-8, UTF-16 oder UTF-32 kodiert werden. Die Standardkodierung ist UTF-8, und JSON-Text, der in UTF-8 kodiert ist, ist interoperabel, da er von der größten Anzahl von Implementierungen erfolgreich gelesen wird; es gibt viele Implementierungen, die Texte in anderen Kodierungen (wie UTF-16 und UTF-32) nicht erfolgreich lesen können.

Implementierungen MÜSSEN NICHT ein Byte-Order-Mark (BOM) am Anfang eines JSON-Texts hinzufügen. Für die Interoperabilität KÖNNEN Implementierungen, die JSON-Text parsen, die Anwesenheit eines Byte-Order-Marks ignorieren, anstatt es als Fehler zu behandeln.

8.2. Unicode Characters (Unicode-Zeichen)

Wenn alle im JSON-Text dargestellten Strings vollständig aus Unicode-Zeichen [UNICODE] bestehen (unabhängig davon, wie sie escaped sind), ist dieser JSON-Text interoperabel, da alle Softwareimplementierungen, die ihn parsen, über den Inhalt von Namen und String-Werten in Objekten und Arrays übereinstimmen werden.

Das ABNF in dieser Spezifikation erlaubt jedoch, dass Mitgliedsnamen und String-Werte Bitsequenzen enthalten, die keine Unicode-Zeichen kodieren können; zum Beispiel "\uDEAD" (ein einzelnes ungepaartes UTF-16-Surrogat). Es wurden Instanzen dieser Situation beobachtet, beispielsweise wenn Bibliotheken UTF-16-Strings abschneiden, ohne zu prüfen, ob das Abschneiden ein Surrogat-Paar trennt. Das Verhalten von Software, die JSON-Text mit solchen Werten empfängt, ist unvorhersehbar; zum Beispiel können Implementierungen unterschiedliche Werte für die Länge von String-Werten zurückgeben oder sogar fatale Laufzeitausnahmen erleiden.

8.3. String Comparison (String-Vergleich)

Softwareimplementierungen müssen häufig die Gleichheit von Objektmitgliedsnamen testen. Implementierungen, die die Textdarstellung in eine Sequenz von Unicode-Codeeinheiten umwandeln und dann einen numerischen Vergleich Codeeinheit für Codeeinheit durchführen, sind interoperabel, da Implementierungen in allen Fällen über die Gleichheit oder Ungleichheit zweier Strings übereinstimmen werden. Zum Beispiel könnten Implementierungen, die bedingungslos escaped Strings vergleichen, fälschlicherweise feststellen, dass "a\\b" und "a\u005Cb" nicht gleich sind.