2016-07-19 20 views
0

Um einen Codepunkt zu umgehen, der sich nicht in der Basic Multilingual Plane befindet, wird das Zeichen als eine aus zwölf Zeichen bestehende Sequenz dargestellt, die das UTF-16-Ersatzpaar codiert. So kann z. B. eine Zeichenfolge, die nur das G-Schlüssel-Zeichen (U + 1D11E) enthält, als "\uD834\uDD1E" dargestellt werden.Warum codiert JSON UTF-16-Ersatzpaare anstelle von Unicode-Codepunkten direkt?

ECMA-404: The JSON Data Interchange Format

Ich glaube, dass there is no need to encode this character at all, so dass es direkt als "" dargestellt werden könnte. Sollte es jedoch gewünscht sein, es zu codieren, muss es pro Spezifikation als "\uD834\uDD1E" codiert werden, nicht (wie es vernünftig erscheint) als "\u1d11e". Warum ist das?

+1

Für hysterische Rosinen. Entschuldigung, historische Gründe :-) Und ja, Sie haben die Wahl, direkt einen Unicode-Codepunkt zu verwenden oder ein verschlüsseltes Ersatzpaar zu verwenden. – gnasher729

+1

Das Escape-Format ist auf 4 Hexadezimalziffern beschränkt und kann daher nur 16-Bit-Werte codieren. 0x1D11E passt nicht in 16 Bits, also die Verwendung eines Ersatzpaares. Dies geht auf die Zeit von UCS-2 zurück, als alle Unicode-Codepunkte zu dieser Zeit in 16 Bits passten. Als Unicode 16 Bits abnahm, wurde UTF-16 erfunden, um die Codierungsbeschränkung zu übertreffen, aber es muss immer noch abwärtskompatibel mit existierenden UCS-2 Daten und Formaten sein. –

+0

Die Unterstützung von '" \ u1d11e "' bedeutet '' '' würde es erschweren, den String '' ᴑe'' mit '\ u1d11' für das' ᴑ' zu codieren. Eine bessere Frage wäre, warum die Unterstützung für eine Sequenz wie "\ U0001d11e" nicht zur Sprache hinzugefügt wurde (wie in Python und C++). –

Antwort

2

Eine der Schlüsseleigenschaften von JSON ist, dass JSON-kodierte Objekte gültige Javascript-Literale sind, die beispielsweise mit der Funktion eval ausgewertet werden können. Leider unterstützen ältere JavaScript-Implementierungen nur 16-Bit-Unicode-Escape-Sequenzen mit vier Hexadezimalzeichen in String-Literalen. Daher gibt es keine andere Möglichkeit als UTF-16-Surrogate in Escape-Sequenzen für Codepunkte über 0xFFFF auf portable Weise zu verwenden. (Die \u{...}-Syntax, die beliebige Codepunkte ermöglicht, wurde nur in ECMAScript 6 eingeführt.)

Aber wie Sie bereits erwähnt haben, müssen Sie keine Escape-Sequenzen verwenden, wenn Ihre Anwendung Unicode-JSON-Text unterstützt. Kodieren Sie die Zeichen einfach im jeweiligen Unicode-Format.