Attribut HTML accept-charset
L'attribut HTML accept-charset spécifie l'encodage de caractères à utiliser lors de la soumission du formulaire. Découvrez son usage sur <form>.
L'attribut HTML accept-charset indique l'encodage de caractères (charset) que le navigateur doit utiliser lorsqu'il soumet un formulaire au serveur.
Cet attribut ne peut être utilisé que sur l'élément <form> — il n'a aucune signification sur les champs de saisie, les boutons ou tout autre élément. Sa valeur est une liste d'un ou plusieurs encodages de caractères, séparés par des espaces ou des virgules. La valeur par défaut est UNKNOWN, ce qui indique au navigateur d'utiliser le même encodage que le document contenant le formulaire. Il n'est jamais nécessaire d'écrire accept-charset="UNKNOWN" explicitement : c'est le comportement par défaut obtenu en omettant entièrement l'attribut.
Pourquoi cet attribut existe
Pour comprendre accept-charset, il faut s'imaginer le web avant que UTF-8 ne devienne universel. À la fin des années 1990 et dans les années 2000, les documents étaient couramment servis dans des encodages sur un octet tels que ISO-8859-1 (Europe occidentale), Shift_JIS (japonais) ou windows-1251 (cyrillique). Une page dans un encodage pouvait envoyer des données à un serveur qui en attendait un autre, et un champ de formulaire contenant des caractères que l'encodage cible ne pouvait pas représenter arrivait sur le serveur sous forme d'octets illisibles (mojibake). accept-charset était la solution de contournement : il permettait à un auteur de préciser « encode la soumission de ce formulaire dans ce charset, quel que soit l'encodage de la page elle-même ».
Cette incompatibilité est la seule situation dans laquelle l'attribut avait un intérêt — une page dans un encodage hérité alimentant un backend qui en attendait un autre. Une fois l'ensemble de la chaîne standardisé sur UTF-8, le problème a disparu.
Important — cet attribut est aujourd'hui sans effet en pratique. En pratique, tous les navigateurs modernes soumettent les données de formulaire en utilisant l'encodage du document lui-même — UTF-8 pour toute page moderne — indépendamment de
accept-charset. (L'algorithme de soumission de formulaire HTML définit bien comment un encodage listé serait sélectionné, mais comme les pages et les navigateurs d'aujourd'hui utilisent UTF-8 de bout en bout, l'attribut ne change rien.) Pour les nouvelles pages, la bonne façon de contrôler l'encodage est de servir le document en UTF-8 (avec<meta charset="UTF-8">) et de laisser le navigateur soumettre en UTF-8 — il n'est presque jamais nécessaire d'utiliseraccept-charset.
Syntaxe
<form accept-charset="character_set"></form>Valeurs courantes de jeu de caractères
| Valeur | Description |
|---|---|
UTF-8 | Encodage Unicode universel. Comportement par défaut de tous les navigateurs modernes et valeur recommandée pour pratiquement tous les formulaires. |
ISO-8859-1 | Latin-1, un encodage 8 bits hérité pour les langues d'Europe occidentale. Ne peut pas représenter la plupart des caractères non latins ; pertinent uniquement pour les anciens systèmes. |
UNKNOWN | La valeur par défaut. Indique au navigateur d'utiliser le même encodage que le document contenant le formulaire. |
Il est possible de lister plusieurs encodages (par exemple accept-charset="UTF-8 ISO-8859-1") ; le navigateur est censé choisir le premier qu'il peut prendre en charge. Dans les navigateurs modernes, cette liste est ignorée en pratique.
Usage moderne et correct
Pour pratiquement tous les formulaires écrits aujourd'hui, la bonne approche consiste à ne rien faire de spécial : servir la page en UTF-8 et omettre accept-charset. Le formulaire soumet alors automatiquement en UTF-8, ce que votre serveur doit attendre.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Contact form</title>
</head>
<body>
<!-- No accept-charset needed: UTF-8 page submits as UTF-8 -->
<form action="/contact" method="post">
<input type="text" name="name" placeholder="Your name" />
<input type="email" name="email" placeholder="Your email" />
<input type="submit" value="Send" />
</form>
</body>
</html>Si vous préférez être explicite, écrire accept-charset="UTF-8" est sans danger et documente votre intention — mais cela ne change rien, car UTF-8 est déjà le comportement appliqué.
Exemple de l'attribut HTML accept-charset
L'exemple ci-dessous définit accept-charset="ISO-8859-1", un encodage hérité, pour illustrer la syntaxe de l'attribut. Notez que les navigateurs actuels soumettront ce formulaire en UTF-8 de toute façon — il s'agit d'une démonstration, pas d'une recommandation.
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
input {
display: block;
margin-bottom: 10px;
}
</style>
</head>
<body>
<form action="/form/submit" accept-charset="ISO-8859-1" method="post">
<input type="text" name="name" placeholder="Enter your Name" />
<input type="text" name="surname" placeholder="Enter your Surname" />
<input type="number" name="age" placeholder="Enter your Age" />
<input type="submit" value="Send" />
</form>
</body>
</html>Attributs de formulaire associés
L'attribut accept-charset fonctionne avec les autres attributs définis sur un <form> :
action— l'URL vers laquelle les données du formulaire sont envoyées.method— la méthode HTTP (GETouPOST) utilisée pour soumettre le formulaire.- Balise
<form>— l'élément conteneur auquel ces attributs appartiennent.
L'attribut enctype associé (défini sur le <form>) contrôle la façon dont les données du formulaire sont encodées (par exemple multipart/form-data pour les téléchargements de fichiers), ce qui est une préoccupation distincte de l'encodage de caractères que décrit accept-charset. Consultez le chapitre Formulaires HTML pour une vue d'ensemble complète, y compris enctype.
Que faire si je dois vraiment prendre en charge un serveur hérité non UTF-8 ?
Comme les navigateurs ignorent accept-charset, il est impossible de forcer une page UTF-8 à soumettre en ISO-8859-1 (ou tout autre charset) simplement en définissant cet attribut — cette voie est sans issue. Si vous êtes bloqué avec un ancien backend qui ne comprend qu'un encodage sur un octet, la bonne correction se trouve côté serveur, pas dans le HTML :
- Convertir côté serveur. Recevez la soumission en UTF-8 et transcodez-la vers l'encodage hérité dont votre application a besoin (par exemple avec
mb_convert_encodingen PHP,bytes.decode/encodeen Python, ou l'équivalent de votre plateforme). C'est l'approche moderne et recommandée. - Migrer le backend vers UTF-8 dans la mesure du possible — cela supprime définitivement toute cette classe de problèmes.
Traiter la soumission en UTF-8 sur le réseau et convertir à la frontière est fiable ; se reposer sur accept-charset pour le faire à votre place ne l'est pas.