Aussi disponible en : English · Español · Português · العربية
Encodage de caractères : tous les charsets d'un navigateur
La liste complète qu'un navigateur doit gérer, un décodeur qui tourne dans le vôtre, et ce qu'une étiquette désigne vraiment.
Qu'est-ce qu'un encodage de caractères ?
Un fichier contient des octets. Un encodage de caractères est la convention qui transforme ces octets en lettres : l'octet 0x41 est un A, les deux octets 0xC3 0xA9 sont un é. Quand la convention est fausse, on obtient du mojibake — les mêmes octets lus avec la mauvaise table, qui donnent é là où un é était prévu.
Il a existé des centaines de ces conventions, une par langue et par constructeur. Le web les a resserrées : l'Encoding Standard du WHATWG énumère exactement 40 encodages et les 228 étiquettes qui les nomment, et c'est la rareté d'une liste qui ne peut pas grandir. Il l'écrit lui-même : le tableau recense tous les encodages et étiquettes qu'un agent utilisateur doit gérer, et il ne doit en gérer aucun autre. L'un des 40 est en vigueur. Les 39 autres figurent sous des titres qui commencent par le mot hérités.
Cette fermeture est ce qui distingue cette liste de n'importe quel registre auquel elle ressemble. Un registre consigne ce qui existe et gagne des lignes. Celle-ci est un plafond.
Comment l'utiliser
- Entrez des octets en hexadécimal : 93 77 6f 72 6c 64 94 en fait sept. Tout le reste est traité comme du texte et encodé d'abord en UTF-8, seul encodage qu'un navigateur sache écrire.
- Nommez un encodage avec n'importe laquelle des 228 étiquettes, dans n'importe quelle casse. Une étiquette inconnue est un échec et non un repli silencieux, comme la norme l'exige.
- Lisez la comparaison en dessous : les mêmes octets y sont décodés sous quatre étiquettes différentes qui désignent un seul encodage, si bien que les quatre lignes sortent identiques — et c'est tout l'intérêt.
Il n'existe pas d'encodage ASCII, ni de Latin-1
Demandez ascii à un navigateur et vous obtenez windows-1252. Demandez us-ascii, iso-8859-1, latin1, cp819 ou ansi_x3.4-1968 et vous obtenez encore windows-1252. Dix-sept des 228 étiquettes s'entassent sur cette seule ligne, et ni ASCII ni ISO-8859-1 n'existent dans la norme sous leur propre nom — alors qu'ISO-8859-2 et ISO-8859-15 y sont, ce qui fait de cette absence une décision plutôt qu'un oubli.
Cela compte parce que windows-1252 n'est pas ISO-8859-1. En décodant les 256 valeurs d'octet avec les deux définitions, elles diffèrent sur 27, et ces 27 tombent toutes dans la plage 0x80 à 0x9F, qu'ISO-8859-1 remplit de codes de contrôle invisibles et que Microsoft a remplie de ponctuation. L'octet 0x80 est le symbole de l'euro. De 0x91 à 0x94 se trouvent les guillemets courbes. 0x96 et 0x97 sont le tiret demi-cadratin et le tiret cadratin. 0x85 est le point de suspension.
Autrement dit, les caractères sur lesquels les deux divergent sont exactement ceux qu'un traitement de texte insère sans qu'on le lui demande, et c'est pourquoi un document enregistré en Latin-1 et servi en Latin-1 affiche quand même les bons guillemets : le navigateur n'utilisait pas Latin-1. Cinq des valeurs laissées vides par Microsoft restent des caractères de contrôle au lieu de devenir U+FFFD, si bien que rien dans cette plage n'échoue jamais au décodage.
Cela borne aussi la confiance qu'on peut accorder à la totalité d'un encodage sur un octet : sur les 28 encodages de ce type, 150 positions n'ont aucun caractère et se décodent en U+FFFD, réparties sur neuf d'entre eux. Croire que tout octet est un caractère est raisonnable et faux.
Lire quarante, écrire un seul
Un navigateur décode les 40. Il en encode exactement un. La norme fixe à utf-8 la propriété encoding d'un encodeur de texte et ne donne aucun argument à son constructeur : il n'existe donc aucun moyen prévu de demander à un navigateur d'écrire du Shift_JIS ou du windows-1251. La section 4.3 pousse la règle plus loin : quand l'analyse d'une URL ou l'envoi d'un formulaire réclament un encodage de sortie, replacement et les deux UTF-16 sont réécrits en UTF-8 avant toute écriture.
Une entrée est plus étrange que les autres. L'encodage nommé replacement ne décode rien : toute entrée non vide devient un unique U+FFFD. Six étiquettes le désignent, dont cinq encodages réels et déployés — ISO-2022-CN, ISO-2022-KR, HZ-GB-2312 et leurs alias. La norme en donne franchement la raison : il existe pour empêcher les attaques qui exploitent un décalage entre les encodages gérés par un serveur et ceux gérés par un client. ISO-2022-JP a survécu à la même coupe uniquement parce que trop de contenu en dépend.
Enfin, une étiquette tranche une question que l'on se pose souvent de travers : utf-16, sans boutisme précisé, veut dire petit-boutiste. L'étiquette unicode aussi.
Ce que cette page ne peut pas vous dire
Le décodeur ici est celui de votre navigateur, pas le nôtre, et c'est volontaire : c'est la seule implémentation dont la réponse vous concerne, et celle pour laquelle la norme est écrite. Cela signifie aussi que le résultat peut différer d'un autre environnement. Node, par exemple, refuse purement et simplement l'encodage replacement alors que la norme impose de le gérer, si bien qu'un décodage qui fonctionne ici peut échouer dans un script.
Ensuite, cette page dit ce qu'une étiquette signifie, pas ce qu'un fichier est. Rien dans une suite d'octets n'indique quel encodage l'a produite ; le deviner est un problème distinct et bien plus difficile, et la réponse honnête pour tout fichier que vous maîtrisez est de le convertir en UTF-8 et d'arrêter de deviner.
Enfin, il s'agit d'une norme du web. Les bases de données, les terminaux et les langages de programmation implémentent leurs propres tables et ne s'accordent pas toujours. Comparées octet par octet aux codecs de Python sur les 28 encodages d'un octet, 18 sont identiques et les autres diffèrent sur 89 des 7 168 positions, le plus souvent là où Python refuse un octet que Microsoft a laissé indéfini tandis qu'un navigateur renvoie un caractère de contrôle. Il reste un vrai désaccord, sur deux positions de KOI8-U, où les deux projets ont hérité de versions différentes du même encodage.
Pourquoi est-ce gratuit ?
Le tableau tient en quelques kilo-octets livrés avec la page, et le décodage est fait par le navigateur que vous avez déjà. Rien de ce que vous tapez n'est envoyé, rien n'est journalisé, et il n'y a aucun compte à créer.
Sans inscription, sans limite, et sans filigrane sur ce que vous copiez.