web-dev-qa-db-fra.com

application / x-www-form-urlencoded et charset = "utf-8"?

Est-il habituel d'omettre ;charset="utf-8" lorsque le type de contenu est application/x-www-form-urlencoded?

En particulier, lorsque vous utilisez accept-charset="utf-8" dans une balise de formulaire, je m'attendrais à une indication que utf-8 est utilisé dans les en-têtes, mais je n'en vois aucun.

Voici mon test simple dans Chrome. La page du formulaire est:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>
<form method="POST" action="printenv.cgi" accept-charset="utf-8">
Your name:
<input name="name" type="text" size="30">
</form>
</body>
</html>

Et les en-têtes de la demande générée sont:

POST /printenv.cgi HTTP/1.1
Host: ...:8000
Connection: keep-alive
Content-Length: 19
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: http://...:8000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://...:8000/utf8-test.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

Quelle est la convention pour spécifier comment les valeurs des paramètres de formulaire sont codées?

27
ErikR

1) Aucun paramètre charset n'est défini pour ce type de support.

2) Pour les directives d'encodage, voir https://www.w3.org/TR/html5/sec-forms.html#application-x-www-form-urlencoded-encoding-algorithm .

28
Julian Reschke

Remarque: à l'étape 2 du lien ci-dessus, il est dit: "Sinon, laissez le codage de caractères sélectionné être UTF-8 ." (voir: http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm .)

Je crois également que cela semble indiquer que c'est une meilleure pratique pour les agents utilisateurs d'utiliser UTF-8?

http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars

Voici ce qu'il dit: B.2.1 Caractères non ASCII dans les valeurs d'attribut URI

Bien que les URI ne contiennent pas de valeurs non ASCII (voir [URI], section 2.1), les auteurs les spécifient parfois dans des valeurs d'attribut qui attendent des URI (c'est-à-dire définies avec% URI; dans la DTD). Par exemple, la valeur href suivante est illégale:

...

Nous recommandons que les agents utilisateurs adoptent la convention suivante pour gérer les caractères non ASCII dans de tels cas:

Represent each character in UTF-8 (see [RFC2279]) as one or more bytes.
Escape these bytes with the URI escaping mechanism (i.e., by converting each byte to %HH, where HH is the hexadecimal notation of the byte value).

Cette procédure aboutit à un URI syntaxiquement légal (tel que défini dans [RFC1738], section 2.2 ou [RFC2141], section 2) qui est indépendant du codage de caractères auquel le document HTML portant l'URI peut avoir été transcodé.

Remarque. Certains agents utilisateurs plus anciens traitent trivialement les URI en HTML en utilisant les octets du codage de caractères dans lequel le document a été reçu. Certains documents HTML plus anciens s'appuient sur cette pratique et se cassent lorsqu'ils sont transcodés. Les agents utilisateurs qui souhaitent gérer ces documents plus anciens doivent, lors de la réception d'un URI contenant des caractères en dehors de l'ensemble légal, utiliser d'abord la conversion basée sur UTF-8. Ce n'est que si l'URI résultant ne se résout pas qu'ils doivent essayer de construire un URI basé sur les octets du codage de caractères dans lequel le document a été reçu.

Remarque. La même conversion basée sur UTF-8 doit être appliquée aux valeurs de l'attribut name pour l'élément A.

4
atom88