Referenz: Warum werden meine "speziellen" Unicode-Zeichen mithilfe von json_encode merkwürdig codiert?

7

Wenn Sie "spezielle" Unicode-Zeichen verwenden, erscheinen sie als merkwürdiger Abfall, wenn sie in JSON codiert sind:

%Vor%

Warum? Habe ich etwas falsch mit meinen Kodierungen gemacht?

(Dies ist eine Referenzfrage, um das Thema ein für allemal zu klären, da dies immer wieder auftaucht.)

    
deceze 30.03.2014, 15:12
quelle

1 Antwort

18

Zuerst einmal: Hier ist nichts falsch. So können Zeichen in JSON codiert werden. Es ist in der offizielle Standard . Es basiert darauf, wie String-Literale in Javascript ECMAScript ( Abschnitt 7.8.4" Zeichenkettenliterale ") und wird wie folgt beschrieben:

  

Jeder Codepunkt kann als Hexadezimalzahl dargestellt werden. Die Bedeutung einer solchen Zahl wird durch ISO / IEC 10646 bestimmt. Wenn der Codepunkt in der Basic Multilingual Plane liegt (U + 0000 bis U + FFFF), dann kann er als sechsstellige Folge dargestellt werden: ein umgekehrter Solidus, gefolgt von dem Kleinbuchstaben u, gefolgt von vier hexadezimalen Ziffern, die den Codepunkt codieren. [...] So kann beispielsweise eine Zeichenkette, die nur ein einzelnes umgekehrtes Soliduszeichen enthält, als "\ u005C" dargestellt werden.

Kurz gesagt: Jedes Zeichen kann als \u.... codiert werden, wobei .... der Unicode-Codepunkt des Zeichens (oder der Codepunkt der Hälfte eines UTF-16-Ersatzpaars für Zeichen außerhalb des BMP) ist.

%Vor%

Diese beiden Zeichenfolgenliterale stellen das exakt gleiche Zeichen dar, sie sind absolut äquivalent. Wenn diese Zeichenfolgenliterale von einem kompatiblen JSON-Parser analysiert werden, führen beide zu der Zeichenfolge "馬". Sie sehen nicht gleich aus, aber sie bedeuten dasselbe im JSON-Datencodierungsformat.

PHP json_encode codiert vorzugsweise Nicht-ASCII-Zeichen mit \u.... Escape-Sequenzen. Technisch muss es nicht, aber es tut es. Und das Ergebnis ist absolut gültig. Wenn Sie anstelle von Escape-Sequenzen lieber Literalzeichen in Ihrem JSON haben möchten, können Sie das JSON_UNESCAPED_UNICODE -Flag in PHP 5.4 oder höher setzen:

%Vor%

Um zu betonen: Dies ist nur eine Präferenz , es ist in keiner Weise notwendig, "Unicode-Zeichen" in JSON zu transportieren.

    
deceze 30.03.2014, 15:12
quelle

Tags und Links