Que signifie vraiment "Content-type: application / json; charset = utf-8"?

Lorsque je fais une requête POST avec un corps JSON à mon service REST, j'inclus Content-type: application/json; charset=utf-8 dans l'en-tête du message. Sans cet en-tête, je reçois une erreur du service. Je peux également utiliser avec succès Content-type: application/json sans la partie ;charset=utf-8.

Que fait exactement charset=utf-8? Je sais qu'il spécifie l'encodage des caractères, mais le service fonctionne bien sans elle. Est-ce que cet encodage limite les caractères qui peuvent être dans le corps du message?

213
demandé sur DenaliHardtail 2012-02-13 06:37:19

3 réponses

L'en-tête indique simplement ce que le contenu est codé. Il n'est pas nécessairement possible de déduire le type de contenu du contenu lui-même, c'est-à-dire que vous ne pouvez pas nécessairement simplement regarder le contenu et savoir quoi en faire. C'est à quoi servent les en-têtes HTTP, ils indiquent au destinataire quel type de contenu ils traitent (supposément).

Content-type: application/json; charset=utf-8 désigne le contenu au format JSON, encodé dans le codage de caractères UTF-8. La désignation de l'encodage est quelque peu redondante pour JSON, depuis la valeur par défaut (seulement?) l'encodage pour JSON est UTF-8. Donc, dans ce cas, le serveur de réception est apparemment heureux de savoir QU'il a affaire à JSON et suppose que L'encodage est UTF-8 par défaut, c'est pourquoi il fonctionne avec ou sans l'en-tête.

Cet encodage limite-t-il les caractères qui peuvent être dans le corps du message?

Non. Vous pouvez envoyer ce que vous voulez dans l'en-tête et le corps. Mais, si les deux ne correspondent pas, vous pouvez obtenir de mauvais résultats. Si vous spécifiez dans l'en-tête que le contenu est codé en UTF-8 mais que vous envoyez en fait du contenu codé en Latin1, le récepteur peut produire des données inutiles, en essayant d'interpréter les données codées en Latin1 comme UTF-8. Si bien sûr vous spécifiez que vous envoyez des données codées Latin1 et que vous le faites réellement, alors oui, vous êtes limité aux 256 caractères que vous pouvez encoder en Latin1.

217
répondu deceze 2012-02-13 02:49:43

Pour étayer l'affirmation de @deceze selon laquelle le codage JSON par défaut est UTF-8...

Depuis IETF RFC4627 :

Le texte JSON doit être codé en Unicode. L'encodage par défaut est UTF-8.

Puisque les deux premiers caractères D'un texte JSON seront toujours ASCII caractères [RFC0020], il est possible de déterminer si un octet le flux est UTF-8, UTF-16 (BE ou LE), ou UTF-32 (be ou LE) en regardant au modèle de nulls dans les quatre premiers Octuor.

      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
129
répondu Drew Noakes 2013-02-19 10:44:46

Notez que IETF RFC4627 a été remplacé par IETF RFC7158. Dans la section [8.1], il rétracte le texte cité par @Drew plus tôt en disant:

Implementations MUST NOT add a byte order mark to the beginning of a JSON text.
15
répondu Alex 2018-01-12 14:29:32