FreeToGenerate.com

Quarante encodages, 228 noms pour les désigner, et pas de quarante et unième.

Décoder des octets

iso-8859-1correspond à windows-1252

13 · lu comme de l'hexadécimal

Les mêmes octets sous quatre étiquettes

Ces quatre étiquettes nomment quatre choses différentes et correspondent à un seul encodage : les quatre lignes sont donc identiques par construction.

La norme, en chiffres

encodages
40
étiquettes
228
en vigueur
1
hérités
39
étiquettes sur windows-1252
17

Cette liste ne peut pas grandir. Section 4.2 : le tableau énumère tous les encodages et étiquettes qu'un agent utilisateur doit gérer, et il ne doit en gérer aucun autre.

Un navigateur lit les 40 et n'en écrit qu'un. TextEncoder ne prend aucun argument et son encodage est spécifié comme utf-8 ; même les URL et l'envoi de formulaire retombent sur UTF-8 pour replacement et pour les deux UTF-16.

Les 40 encodages

40 affichés
EncodageGroupeÉtiquettes
UTF-8L'encodageunicode-1-1-utf-8 unicode11utf8 unicode20utf8 utf-8 utf8 x-unicode20utf8
IBM866Hérités sur un octet866 cp866 csibm866 ibm866
ISO-8859-2Hérités sur un octetcsisolatin2 iso-8859-2 iso-ir-101 iso8859-2 iso88592 iso_8859-2 iso_8859-2:1987 l2 latin2
ISO-8859-3Hérités sur un octetcsisolatin3 iso-8859-3 iso-ir-109 iso8859-3 iso88593 iso_8859-3 iso_8859-3:1988 l3 latin3
ISO-8859-4Hérités sur un octetcsisolatin4 iso-8859-4 iso-ir-110 iso8859-4 iso88594 iso_8859-4 iso_8859-4:1988 l4 latin4
ISO-8859-5Hérités sur un octetcsisolatincyrillic cyrillic iso-8859-5 iso-ir-144 iso8859-5 iso88595 iso_8859-5 iso_8859-5:1988
ISO-8859-6Hérités sur un octetarabic asmo-708 csiso88596e csiso88596i csisolatinarabic ecma-114 iso-8859-6 iso-8859-6-e iso-8859-6-i iso-ir-127 iso8859-6 iso88596 iso_8859-6 iso_8859-6:1987
ISO-8859-7Hérités sur un octetcsisolatingreek ecma-118 elot_928 greek greek8 iso-8859-7 iso-ir-126 iso8859-7 iso88597 iso_8859-7 iso_8859-7:1987 sun_eu_greek
ISO-8859-8Hérités sur un octetcsiso88598e csisolatinhebrew hebrew iso-8859-8 iso-8859-8-e iso-ir-138 iso8859-8 iso88598 iso_8859-8 iso_8859-8:1988 visual
ISO-8859-8-IHérités sur un octetcsiso88598i iso-8859-8-i logical
ISO-8859-10Hérités sur un octetcsisolatin6 iso-8859-10 iso-ir-157 iso8859-10 iso885910 l6 latin6
ISO-8859-13Hérités sur un octetiso-8859-13 iso8859-13 iso885913
ISO-8859-14Hérités sur un octetiso-8859-14 iso8859-14 iso885914
ISO-8859-15Hérités sur un octetcsisolatin9 iso-8859-15 iso8859-15 iso885915 iso_8859-15 l9
ISO-8859-16Hérités sur un octetiso-8859-16
KOI8-RHérités sur un octetcskoi8r koi koi8 koi8-r koi8_r
KOI8-UHérités sur un octetkoi8-ru koi8-u
macintoshHérités sur un octetcsmacintosh mac macintosh x-mac-roman
windows-874Hérités sur un octetdos-874 iso-8859-11 iso8859-11 iso885911 tis-620 windows-874
windows-1250Hérités sur un octetcp1250 windows-1250 x-cp1250
windows-1251Hérités sur un octetcp1251 windows-1251 x-cp1251
windows-1252Hérités sur un octetansi_x3.4-1968 ascii cp1252 cp819 csisolatin1 ibm819 iso-8859-1 iso-ir-100 iso8859-1 iso88591 iso_8859-1 iso_8859-1:1987 l1 latin1 us-ascii windows-1252 x-cp1252
windows-1253Hérités sur un octetcp1253 windows-1253 x-cp1253
windows-1254Hérités sur un octetcp1254 csisolatin5 iso-8859-9 iso-ir-148 iso8859-9 iso88599 iso_8859-9 iso_8859-9:1989 l5 latin5 windows-1254 x-cp1254
windows-1255Hérités sur un octetcp1255 windows-1255 x-cp1255
windows-1256Hérités sur un octetcp1256 windows-1256 x-cp1256
windows-1257Hérités sur un octetcp1257 windows-1257 x-cp1257
windows-1258Hérités sur un octetcp1258 windows-1258 x-cp1258
x-mac-cyrillicHérités sur un octetx-mac-cyrillic x-mac-ukrainian
GBKChinois simplifié (hérités)chinese csgb2312 csiso58gb231280 gb2312 gb_2312 gb_2312-80 gbk iso-ir-58 x-gbk
gb18030Chinois simplifié (hérités)gb18030
Big5Chinois traditionnel (hérités)big5 big5-hkscs cn-big5 csbig5 x-x-big5
EUC-JPJaponais (hérités)cseucpkdfmtjapanese euc-jp x-euc-jp
ISO-2022-JPJaponais (hérités)csiso2022jp iso-2022-jp
Shift_JISJaponais (hérités)csshiftjis ms932 ms_kanji shift-jis shift_jis sjis windows-31j x-sjis
EUC-KRCoréen (hérités)cseuckr csksc56011987 euc-kr iso-ir-149 korean ks_c_5601-1987 ks_c_5601-1989 ksc5601 ksc_5601 windows-949
replacementDivers (hérités)csiso2022kr hz-gb-2312 iso-2022-cn iso-2022-cn-ext iso-2022-kr replacement
UTF-16BEDivers (hérités)unicodefffe utf-16be
UTF-16LEDivers (hérités)csunicode iso-10646-ucs-2 ucs-2 unicode unicodefeff utf-16 utf-16le
x-user-definedDivers (hérités)x-user-defined

Noms, étiquettes et groupes proviennent du fichier encodings.json de l'Encoding Standard du WHATWG. Le décodage est fait par votre navigateur, qui applique cette même norme.

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

  1. 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.
  2. 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.
  3. 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.