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?
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
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. –
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++). –