web-dev-qa-db-fra.com

Quel codage de caractères dois-je utiliser pour un en-tête HTTP?

J'utilise un caractère spécial "amusant" HTML () (voir http://html5boilerplate.com/ pour plus d'informations) pour un Server HTTP-header et je me pose des questions. s'il est "autorisé" par spécification.

  • Utilisation de l'onglet Réseau dans les outils de développement de Chrome sous Windows Xp Pro SP 3, je vois que le est parfait.).

  • Dans IE8, le est pas rendu correctement.

  • Le validateur HTML de w3.org fait pas le restitue correctement (affiche "â°" au lieu).

Maintenant, je n’aime pas trop les encodages de caractères ... et franchement, je ne me soucie pas vraiment d’eux; Je viens d'utiliser aveuglément UTF-8 cus on me le dit. :-)


La disparité est-elle causée par des bugs dans les différents analyseurs/navigateurs/navigateurs/moteurs/(comme ils sont appelés)?

Existe-t-il une spécification pour cela ou peut-être une liste de caractères autorisés pour une "valeur" d'en-tête HTTP?

111
David Murdoch

En bref: Seul ASCII est garanti pour fonctionner. Certains octets non-ASCII sont autorisés pour la compatibilité ascendante, mais ne sont pas supposés être affichables.

HTTPbis a abandonné et a précisé que dans les en-têtes, il n'y a pas d'encodage utile en plus de l'ASCII:

Historiquement, HTTP a autorisé le contenu de champ avec du texte dans le jeu de caractères ISO-8859-1 [ISO-8859-1], prenant en charge d'autres jeux de caractères uniquement via l'utilisation du codage [RFC2047]. En pratique, la plupart des valeurs de champ d'en-tête HTTP utilisent uniquement un sous-ensemble du jeu de caractères US-ASCII [USASCII]. Les champs d'en-tête nouvellement définis DEVRAIENT limiter leurs valeurs de champ aux octets US-ASCII. Un destinataire DEVRAIT traiter les autres octets du contenu du champ (obs-text) comme des données opaques.


Auparavant, la RFC 2616 de 1999 définissait ceci:

Les mots * TEXT PEUVENT contenir des caractères provenant de jeux de caractères autres que ISO-8859-1 [22] uniquement lorsqu'ils sont codés selon les règles de la RFC 2047 [14].

et RFC 2047 est le encodage MIME , donc ce serait:

=?UTF-8?Q?=E2=9C=B0?=

mais je ne pense pas que beaucoup (le cas échéant) de clients l'appuient.

112
Kornel

Veuillez lire les commentaires en premier, cette réponse tire probablement des conclusions erronées des bonnes sources et doit être modifiée.


Vous pouvez utiliser n'importe quel caractère ASCII), et aucun caractère spécial comme (ce qui n'est pas ASCII )

Astuce : vous pouvez tout encoder en JSON.

Edit : peut ne pas être évident au début, le codage de caractères défini dans l'en-tête ne s'applique qu'au corps de la réponse, pas à l'en-tête lui-même. (Comme cela causerait un problème de œuf et de poulet.)


Je voudrais résumer toutes les définitions pertinentes selon le spec lié par Penchant.

message-header = field-name ":" [ field-value ]
field-name     = token
field-value    = *( field-content | LWS )

Nous sommes donc après la valeur du champ .

LWS            = [CRLF] 1*( SP | HT )
CRLF           = CR LF
CR             = <US-ASCII CR, carriage return (13)>
LF             = <US-ASCII LF, linefeed (10)>
SP             = <US-ASCII SP, space (32)>
HT             = <US-ASCII HT, horizontal-tab (9)>

LWS signifie "espace blanc linéaire". LWS est essentiellement un espace ou une tabulation, mais vous pouvez diviser votre valeur de champ en plusieurs lignes en commençant une nouvelle ligne avant un espace ou une tabulation.

Simplifions cela à ceci:

field-value    = <any field-content or Space or Tab>

Nous sommes maintenant après le contenu du champ .

field-content  = <the OCTETs making up the field-value
                 and consisting of either *TEXT or combinations
                 of token, separators, and quoted-string>
OCTET          = <any 8-bit sequence of data>
TEXT           = <any OCTET except CTLs,
                 but including LWS>
CTL            = <any US-ASCII control character
                 (octets 0 - 31) and DEL (127)>
token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@"
                 | "," | ";" | ":" | "\" | <">
                 | "/" | "[" | "]" | "?" | "="
                 | "{" | "}" | SP | HT

TEXT est le plus général et inclut tout le reste, alors oubliez le reste. Voici le jeu de caractères US-ASCII (= ASCII)

Comme vous pouvez le constater, tous les caractères imprimables ASCII sont autorisés.

10
zupa