Was bedeutet “Inhaltstyp: application / json; charset = utf-8 “wirklich gemein?

Wenn ich eine POST-Anfrage mit einem JSON-Body an meinen REST-Service mache, schließe ich den Content-type: application/json; charset=utf-8 Content-type: application/json; charset=utf-8 im Nachrichtenkopf. Ohne diesen Header erhalte ich einen Fehler vom Dienst. Ich kann auch Content-type: application/json erfolgreich verwenden Content-type: application/json ohne den Abschnitt ;charset=utf-8 .

Was genau macht charset=utf-8 ? Ich weiß, dass es die Zeichencodierung spezifiziert, aber der Dienst funktioniert gut ohne es. Schränkt diese Codierung die Zeichen ein, die im Nachrichtentext enthalten sein können?

   

Der Header gibt nur an, wofür der Inhalt kodiert ist. Es ist nicht unbedingt möglich, den Inhaltstyp aus dem Inhalt selbst abzuleiten, dh man muss nicht unbedingt nur auf den Inhalt schauen und wissen, was damit zu tun ist. Dafür gibt es HTTP-Header. Sie teilen dem Empfänger mit, mit welchen Inhalten er (angeblich) zu tun hat.

Content-type: application/json; charset=utf-8 Content-type: application/json; charset=utf-8 bezeichnet den Inhalt im JSON-Format, codiert in der UTF-8-Zeichencodierung. Die Codierung ist für JSON etwas redundant, da die Standardkodierung (nur?) Für JSON UTF-8 ist. In diesem Fall ist der empfangende Server offenbar froh zu wissen, dass es sich um JSON handelt, und nimmt an, dass die Codierung standardmäßig UTF-8 ist, weshalb es mit oder ohne Header funktioniert.

Schränkt diese Codierung die Zeichen ein, die im Nachrichtentext enthalten sein können?

Nein. Sie können alles, was Sie wollen, in der Kopfzeile und im Text senden. Aber wenn die beiden nicht übereinstimmen, erhalten Sie möglicherweise falsche Ergebnisse. Wenn Sie in der Kopfzeile angeben, dass der Inhalt UTF-8-codiert ist, Sie aber tatsächlich Latin1-kodierten Inhalt senden, kann der Empfänger errorshafte Daten erzeugen und versuchen, Latin1-kodierte Daten als UTF-8 zu interpretieren. Wenn Sie natürlich angeben, dass Sie Latin1-codierte Daten senden, und Sie tun dies tatsächlich, dann sind Sie auf die 256 Zeichen beschränkt, die Sie in Latin1 codieren können.

Um die Behauptung von @ deceze zu untermauern, dass die Standard-JSON-Kodierung UTF-8 ist …

Von IETF RFC4627 :

JSON-Text muss in Unicode codiert sein. Die Standardcodierung ist UTF-8.

Da die ersten zwei Zeichen eines JSON-Textes immer ASCII-Zeichen sind [RFC0020], kann festgestellt werden, ob ein Oktettstrom UTF-8, UTF-16 (BE oder LE) oder UTF-32 (BE oder LE) ist. indem Sie das Muster der Nullen in den ersten vier Oktetts betrachten.

  00 00 00 xx UTF-32BE 00 xx 00 xx UTF-16BE xx 00 00 00 UTF-32LE xx 00 xx 00 UTF-16LE xx xx xx xx UTF-8 

Beachten Sie, dass IETF RFC4627 durch IETF RFC7158 ersetzt wurde . In Abschnitt [8.1] zieht es den von @Drew zitierten Text zurück, indem er sagt:

 Implementations MUST NOT add a byte order mark to the beginning of a JSON text.