# ISO/CEI 8859-1

En informatique, la norme ISO 8859-1, dont le nom complet est ISO/CEI 8859-1, et qui est souvent appelée Latin-1, forme la première partie de ISO/CEI 8859, une norme internationale de l’Organisation internationale de normalisation et de la CEI pour le codage des caractères.
Elle définit ce qu’elle appelle l’alphabet latin numéro 1, qui consiste en 191 caractères de l’alphabet latin, chacun d’entre eux étant codé sur un octet (soit 8 bits). ISO 8859-1 reprend le codage des caractères imprimables de l’US-ASCII.
Dans les pays occidentaux, cette norme était utilisée par de nombreux systèmes d’exploitation, dont UNIX, Windows ou AmigaOS. Elle a donné lieu à quelques extensions et adaptations, dont Windows-1252 et ISO/CEI 8859-15. La distinction entre ASCII, ISO 8859-1, ISO 8859-15, Windows-1252 et MacRoman est une source de confusion parmi les développeurs de programmes informatiques. Le Multinational Character Set créé par Digital Equipment Corporation pour le terminal informatique VT220 est considéré comme à la fois l’ancêtre d’ISO 8859-1 et d’Unicode. Après avoir été quelque temps en concurrence avec Unicode, il n'est aujourd'hui quasiment plus utilisé, au profit de ce dernier.

## Principe

En première approximation, le jeu de caractères codés sur 8 bits de la norme ISO/CEI 8859-1 est une extension du jeu de caractères codés sur 7 bits de la norme américaine US-ASCII (qui est une des variantes de la norme de base ISO/CEI 646). Cependant ce codage normalisé au niveau mondial par l’ISO et la CEI n’assigne aucun caractère de contrôle ni aucun autre caractère dans les positions réservées des plages 0x00 à 0x1F et 0x7F à 0x9F.
Il ajoute de nombreux caractères latins manquant dans l’alphabet latin de base défini dans l’US-ASCII (ce qui a permis de déprécier ou rendre obsolètes de nombreuses variantes nationales de la norme ISO 646), ainsi que quelques autres signes de ponctuation ou symboles, ce qui lui permet de recouvrir les caractères nécessaires à l’écriture de nombreuses langues, pour nombre d’entre elles des langues d’Europe occidentale, avec parmi elles des langues nationales officielles comme l’albanais, l’allemand (sauf la lettre ‹ ẞ ›), l’anglais, le danois (sauf les lettres ‹ Ǻ ǻ Ǿ ǿ ›), l’espagnol, le finnois (sauf les lettres ‹ Š š Ž ž ›), le français (sauf les lettres ‹ Œ œ Ÿ ›), l’islandais (sauf les signes de ponctuation ‹ „ “ ›), le gaélique irlandais, l’italien, le latin liturgique (sans les diacritiques du latin moderne), le luxembourgeois, le néerlandais (sauf les lettres ‹ J́ j́ ›), le norvégien (sauf les lettres ‹ Ǻ ǻ ›), le portugais, le romanche, le suédois, et encore de nombreuses autres langues régionales ou minoritaires comme le basque, le bas-saxon, le breton, le catalan, le corse, le féroïen, le gallo, le gaélique écossais, le galicien, l’occitan, le picard, le rromani moderne (mais pas le pan-vlax ni l’alphabet romani standard), le sarde, le vénitien, ou le wallon. Des langues d’autres régions du monde sont également couvertes comme l’afrikaans, l’indonésien, le malais, le swahili, le malgache (sauf les lettres ‹ N̈ n̈ ›), ou le wolof, ainsi que la plupart des créoles et pidgins qui se sont développés en grande partie sur les bases des langues précédentes, tels que le bichelamar, le capverdien (sauf les lettres ‹ N̈ n̈ ›), le créole haïtien, le filipino (souvent improprement appelé tagalog) ou le mauricien.
Cette norme est donc utilisée sur tous les continents, en Europe de l’Ouest, en Amérique, et dans une grande partie de l'Afrique ou de l’Océanie ainsi que certains pays d’Asie du Sud-Est.
Cependant elle ignore quelques caractères européens comme le symbole de l’euro € (qui n’existait pas encore lorsque ce jeu a été normalisé) ou certaines des lettres normalement nécessaires à certaines langues théoriquement couvertes (comme les lettres « œ », « Œ » et « Ÿ » en français, ou les lettres « š » et « Š » en tchèque) : le jeu de caractères universel des normes ISO/CEI 10646 et Unicode (ou plus rarement le jeu de caractères codés ISO/CEI 8859-15) permet de pallier ces absences. Les lettres françaises œ et Œ avaient des places prévues mais n’ont finalement pas été incluses dans ISO/CEI 8859-1, car au contraire du représentant canadien québécois dans le groupe de travail (GT), les deux représentants français s’y opposèrent : l’un estimait à tort qu’il s’agissait d’une simple ligature typographique, et l’autre était employé par un grand fabricant de matériel informatique français qui ne les avait pas incluses dans ses imprimantes bien qu’elles fussent encodées dans ISO/CEI 6937 depuis 1983.
La plupart des 191 caractères codés dans la norme ISO/CEI 8859-1 sont représentés sous forme de glyphes (œil) dans le tableau suivant, à l’exception de trois d’entre eux (décrits après la table). Les titres des lignes et des colonnes indiquent les valeurs hexadécimales correspondant aux positions codées assignées à chaque caractère, par exemple, la valeur hexadécimale de la position codée assignée à la lettre « L » est 0x4C, soit 01001100 en binaire ou 76 en décimal.
ISO/CEI 8859-1 :
| | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF |
| 0x | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées |
| 1x | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées |
| 2x | SP | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
| 3x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4x | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5x | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
| 6x | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7x | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | |
| 8x | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées |
| 9x | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées | positions inutilisées |
| Ax | NBSP | ¡ | ¢ | £ | ¤ | ¥ | ¦ | § | ¨ | © | ª | « | ¬ | - | ® | ¯ |
| Bx | ° | ± | ² | ³ | ´ | µ | ¶ | · | ¸ | ¹ | º | » | ¼ | ½ | ¾ | ¿ |
| Cx | À | Á | Â | Ã | Ä | Å | Æ | Ç | È | É | Ê | Ë | Ì | Í | Î | Ï |
| Dx | Ð | Ñ | Ò | Ó | Ô | Õ | Ö | × | Ø | Ù | Ú | Û | Ü | Ý | Þ | ß |
| Ex | à | á | â | ã | ä | å | æ | ç | è | é | ê | ë | ì | í | î | ï |
| Fx | ð | ñ | ò | ó | ô | õ | ö | ÷ | ø | ù | ú | û | ü | ý | þ | ÿ |
Dans cette table :
* La position 0x20 en hexadécimal (32 en décimal) est assignée au caractère de l’« espace » (elle est souvent représentée par SP, de space en anglais).
* La position 0xA0 en hexadécimal (160 en décimal) est assignée au caractère de l'espace insécable (elle est souvent représentée par NBSP, de no-break space en anglais).
* La position 0xAD en hexadécimal (173 en décimal) est assignée au caractère de formatage indiquant la position d’une possible coupure de mot : il reste normalement invisible lorsqu’il est inséré au milieu d’un mot mais il n’apparaît comme un tiret de coupure de mot que si un saut de ligne est réalisé à cette position ; le tiret est alors accolé après le début du mot coupé et sur la même ligne (il est souvent représenté par SHY, de soft hyphen en anglais).
* Les positions 0x00 à 0x1F en hexadécimal (0 à 31 en décimal) et 0x7F à 0x9F en hexadécimal (127 à 159 en décimal) ne sont assignées à aucun caractère dans le codage normalisé ISO/CEI 8859-1 (leur utilisation éventuelle et leur interprétation dépendent des applications).
* Les 188 caractères imprimables (hors des espaces) sont :
** les symboles issus de signes diacritiques : ^ ` ~ ¨ ¯ ´ ¸
** les signes séparateurs symboliques : _ \ | ¦
** les signes de ponctuation séparateurs : ' " « » : ; ! ¡ ? ¿ § ¶
** les signes de ponctuation souvent utilisés aussi comme signes mathématiques ou numériques : - , . · * / ( ) [ ] { }
** les opérateurs mathématiques et signes numériques : + ± ¬ × ÷ < = >
** les exposants et fractions numériques : ¹ ² ³ ¼ ½ ¾
** les dix chiffres latins de base : 0 1 2 3 4 5 6 7 8 9
** quelques symboles monétaires (n'y figure pas le symbole de l'euro, apparu après la norme) : $ ¢ £ ¤ ¥
** les symboles fréquents d’abréviations et d’unités : # % @ & © ® ° µ
** les paires de lettres latines majuscules et minuscules (bien qu'y figure la ligature Ææ rare en français, il y manque celle du Œœ courante en français) : Aa Àà Áá Ââ Ãã Ää Åå Ææ Bb Cc Çç Dd Ðð Ee Èè Éé Êê Ëë Ff Gg Hh Ii Ìì Íí Îî Ïï Jj Kk Ll Mm Nn Ññ Oo Òò Óó Ôô Õõ Öö Øø Pp Qq Rr Ss Tt Þþ Uu Ùù Úú Ûû Üü Vv Ww Xx Yy Ýý Zz
** les autres lettres latines minuscules et variantes, codées sans majuscule correspondante (il manque notamment le Ÿ utilisé rarement en français) : ª º ß ÿ

## ISO/CEI 8859-1 par rapport à ISO-8859-1

L’IANA en anglais : Internet Assigned Numbers Authority a validé, pour une utilisation sur Internet, le codage ISO-8859-1 (remarquez le tiret supplémentaire), un sur-ensemble de l'ISO/CEI 8859-1.
Ce jeu de caractères codés, ou page de codes, supplée le jeu de caractère codé ISO/CEI 8859-1 en assignant des caractères de contrôle aux positions hexadécimales des plages 0x00 à 0x1F, et 0x7F à 0x9F. On obtient de cette manière 256 caractères recouvrant toutes les positions possibles codées sur 8 bits.
L’IANA autorise l’utilisation des alias enregistrés suivants pour ISO-8859-1 (la casse mentionnée peut être changée librement car elle n’est pas significative) :
* ISO_8859-1:1987
* ISO_8859-1
* ISO-8859-1
* iso-ir-100
* csISOLatin1
* latin1
* l1
* IBM819
* CP819
Le nom Latin-1 est une appellation informelle non reconnue par les organismes de normalisation ISO, CEI ou IANA, mais utilisée par certains logiciels.
Le tableau suivant montre l’ISO-8859-1, avec les abréviations représentant les caractères de contrôle et les espaces.
Il existe d’autres parties de la norme ISO/CEI 8859 à laquelle correspond un jeu de caractères codé validé par l’IANA, par exemple l’ISO/CEI 8859-10 (alphabet latin n$^o$ 6) ressemble fortement au jeu de caractères codés ISO-8859-10.
Chacune des parties de la norme ISO/CEI 8859 définit un jeu de caractères codés sur 8 bits de la même manière : elle assigne les caractères graphiques codés sur 7 bits de la norme ISO/CEI 646 (dans sa version américaine ASCII la plus courante) aux positions codées dans la plage hexadécimale 0x20 à 0x7E, ainsi que 96 caractères supplémentaires aux positions codées dans la plage hexadécimale de 0xA0 à 0xFF, pour un total de 191 caractères codés.
L’IANA définit les jeux de caractères codés « ISO-8859-x » selon la partie correspondante de la norme ISO/CEI 8859, en assignant en plus tous les caractères de contrôle « C0 » de la norme ISO 646 aux positions de la plage hexadécimale 0x00 à 0x1F et à la position hexadécimale 0x7F, ainsi que des caractères de contrôle « C1 » supplémentaires aux positions de la plage hexadécimale de 0x7F à 0x9F, offrant ainsi un ensemble de 256 caractères codés.
Le jeu de caractères codés ISO-8859-1 est le seul, parmi tous ces ensembles de jeux de caractères codés, dont la codification sur 8 bits soit équivalente aux 256 premiers caractères codés du jeu universel de caractères, défini dans les normes ISO/CEI 10646 et Unicode.

## Jeux de caractères codés apparentés
### Windows-1252

Dans la page de codes n$^o$ 1252 définie et utilisée dans Microsoft Windows, quelques caractères ont été assignés aux positions codées dans la plage hexadécimale 0x80 à 0x9F. Cette extension remplace ou annule tous les caractères de contrôle C1 qui sont assignés à ces positions dans le jeu de caractères codés ISO-8859-1 et réservés dans la norme ISO/CEI 8859-1.
Cette page de codes est enregistrée dans la base de données des jeux de caractères codés de l’IANA, pour son usage dans les logiciels et sur Internet, sous le nom Windows-1252.

### ISOLatin1Encoding

PostScript prédéfinit une variante d'ISO/CEI 8859-1, appelée improprement ISOLatin1Encoding, dans laquelle le caractère codé en position 140 (0x8C en hexadécimal) est l’apostrophe gauche ( ‘ ), au lieu de l’accent grave ( ` ).
Cet encodage n’assigne aucun caractère de contrôle C0 ou C1 dans les positions 0x00 à 0x1F et 0x7F à 0x8F. Cependant, il définit certains caractères supplémentaires dans les positions inutilisées entre 0x90 et 0x9F (mais d’une façon différente de la variante Windows-1252) :
* à la position 0x90, la lettre minuscule i sans point ( ı ) ;
* aux positions 0x91 à 0x98, l’accent grave ( ` ), l’accent aigu ( ´ ), l’accent circonflexe ( ˆ ), le tilde en chef ( ˜ ), le macron ( ¯ ), la brève inversée ( ˘ ), le point en chef ( ˙ ) et le tréma ou signe de diérèse ( ¨ ) ;
* aux positions 0x9B et 0x9C, le rond en chef ( ˚ ) et la cédille ( ¸ ) ;
* aux positions 0x9D à 0x9F, le double accent aigu ( ˝ ), l’ogonek ( ˛ ) et le caron ( ˇ ).
Tous les diacritiques y sont codés avec leur chasse dans les polices PostScript Type 1 ou Type 3 (leur combinaison ou positionnement relatif avec une lettre de base étant à la charge du logiciel de composition du document PostScript), cependant les polices TrueType ou OpenType encodées avec Unicode (et utilisables dans certains interprètes PostScript) réutilisent souvent les mêmes glyphes pour définir les diacritiques combinants sans chasse.

### ISO/CEI 8859-15

L'ISO/CEI 8859-15, notamment introduite pour prendre en charge le caractère € de l'euro, gère également mieux le français car les caractères ¤, ¦, ¨, ´, ¸, ¼, ½ et ¾ ont été remplacés par €, Š, š, Ž, ž, Œ, œ et Ÿ. En français, l'ISO 8859-1 reste cependant nettement plus utilisée, avec OE et oe au lieu de Œ et œ, alors que le Ÿ n'est utilisé que par quelques noms propres. Le standard Unicode est généralement utilisé lorsqu'il est nécessaire de dépasser les limites d'ISO 8859-1 pour utiliser, notamment, symboles mathématiques, phonétiques et caractères non-latins.

### MacRoman

Les ordinateurs Apple Macintosh les plus anciens utilisent un codage nommé MacRoman, qui diffère de l'ISO 8859-1 par les 32 premiers et les 127 derniers caractères, mais inclut tout de même tous les caractères présents dans l'ISO 8859-1, à l'exception du tiret invisible. En revanche, le MacRoman inclut de nombreux caractères qui ne sont pas dans l'ISO 8859-1. Le glyphe euro a remplacé le symbole monétaire générique précédent.

## Limitations

La principale limitation de ce jeu de caractères codés sur un octet est la nécessité d'utiliser plusieurs jeux de caractères codés pour couvrir plusieurs alphabets.
Certains documents sont typés à l'aide de méta-données externes et non dans le document lui-même ; dans ce cas un jeu de caractères codés et un seul est associé à chaque document. Par exemple dans les protocoles de transport de données HTTP ou MIME, c’est l’entête Content-Type: qui indique le jeu de caractères utilisés dans le document transporté. Et dans ce cas on mentionnera explicitement l’entête Content-Type: ISO 8859-1 afin de permettre au destinataire d’interpréter le contenu du document transporté, y compris via un transcodage préalable vers le jeu de caractères codés qu’il reconnait ou peut afficher.
Si cette méta-donnée n’est pas précisée, le document stocké ou transporté n’a pas lui-même de jeu de caractères codés clairement défini et il devrait être traité et transporté uniquement de façon opaque, ce qui n’était pas toujours le cas (par exemple dans les protocoles de transports de courrier électronique comme SMTP, même si le protocole ESMTP a été créé comme une extension qui intègre le protocole de transport MIME et est aujourd’hui largement utilisé pour éviter toute altération du contenu binaire de tels documents).
Cependant, même si le protocole de transport ou de stockage du document permet de préserver le codage du document, l’interprétation et l’affichage du document restent ambigus en l'absence de cette méta-donnée. C’est pourquoi certains types de documents permettent de mentionner explicitement le jeu de caractères avec lesquels ils sont codés directement dans leur contenu. Cette information sera fiable à la seule condition que le document ne subisse aucun transcodage et soit traité de façon opaque (ce qui sera le cas dans un système de fichiers stockant les documents sous forme de fichiers binaires), et que cette indication intégrée au document soit elle-même correcte.
Par exemple dans un document HTML, la balise <meta http-equiv="content-Type" content="text/html; charset=iso-8859-1" /> permet de mentionner que le document a été créé en utilisant le jeu de caractères codés ISO-8859-1. Dans un document XML, la déclaration <?xml version="1.0" encoding="iso-8859-1"?> présente au début du document permet de préciser de la même façon que le jeu de caractères codés utilisé pour créer le document est bien ISO-8859-1.
Malheureusement, même si le protocole de transport mentionne le jeu de caractères utilisé, cette méta-donnée essentielle peut être perdue par le destinataire lors de son stockage, et il ne reste alors plus que le document opaque. D’autre part, même le créateur du document peut aussi créer une copie du document en omettant aussi de copier ses métadonnées et transmettre ce fichier en omettant de préciser le codage ou en le stockant dans un système de fichiers (y compris un serveur internet) dont les documents sont, par défaut, supposés être codés dans un autre jeu de caractères, soit parce que le système de stockage ou le serveur est mal réglé, soit encore parce que ce système ne permet pas de stocker cette information. Le document sera donc délivré à son destinataire avec une méta-donnée erronée qui ne correspond pas au codage utilisé lors de la création du document. Le système de stockage ou le serveur devrait être capable de déterminer automatiquement le jeu de caractères utilisé à partir du type de document et de son balisage interne mentionnant explicitement le jeu de caractères utilisé, au lieu de fournir une information erronée au destinataire (mais de nombreux serveurs omettent de le faire, car ils supposent que celui qui a stocké le document a aussi renseigné correctement la métadonnée à délivrer avec le document).
À défaut de la méta-donnée provenant du protocole de transport ou de stockage du document, et d’une déclaration explicite intégrée au document, c’est le logiciel utilisé par le destinataire du document qui tentera éventuellement de déterminer le jeu de caractères codés utilisé, en analysant son contenu. S’il ne le fait pas, le logiciel pourra supposer (éventuellement à tort) que le document utilise un jeu de caractères codés par défaut, propre à ce logiciel ou à ses réglages applicables par défaut à tous les documents qui n’intègrent pas la méta-donnée et tous ceux qui leur sont transmis sans méta-donnée associée.
Malheureusement dans ce cas, le jeu de caractères codés utilisé par défaut par le logiciel du destinataire peut être différent de celui utilisé dans le logiciel utilisé par le créateur du document initial (par exemple sur un autre système ou avec un logiciel différent). L’interprétation du document sera incohérente, et pourra produire ce que les Japonais appellent du « mojibake », qui résulte de l’utilisation du document dans un contexte différent, ou du mélange de données provenant de documents multiples, initialement créés dans des jeux de caractères codés différents mais incorrectement supposés comme identiques.
Le problème est alors l’impossibilité de mélanger dans un même document des alphabets qui ne sont pas définis dans le même jeu de caractères codés (par exemple les alphabets français et hébreu).

## Solutions aux limitations du jeu de caractères
### ISO 2022

La norme ISO 2022 très utilisée en Asie permet de concaténer des textes écrits dans des alphabets différents grâce à la notion de séquence d'échappement. La séquence d'échappement qui introduit l'ISO-8859-1 est la suivante :
Mais la tendance actuelle en dehors de l'Asie se porte sur la compatibilité Unicode.

### Unicode

La meilleure solution est d’utiliser un jeu de caractères codés dit « universel », capable de coder un répertoire très étendu de caractères compatible avec tous les alphabets, notamment celui défini dans les normes ISO/CEI 10646 et Unicode. Un tel jeu universel nécessitera que de très nombreux caractères soient codés individuellement sur plusieurs octets.
Cependant, même avec ce seul jeu de caractères universel ISO/CEI/Unicode, il existe différentes représentations binaires dont l’interprétation peut être très différente si la représentation effective est mal déterminée, un problème qui peut aussi conduire à des interprétations incorrectes mais qui peut se résoudre en intégrant là encore une méta-donnée sur cette représentation, notamment une marque d’ordonnancement (byte order mark en anglais, souvent abrégé BOM) représentée par le caractère codé U+FEFF, placé en tête du document uniquement dans le but de déterminer la représentation binaire utilisée, mais qui ne représente alors lui-même aucun caractère codé significatif dans le document.
Pour ces raisons, le jeu de caractères codés ISO-8859-1 et son sous-ensemble US-ASCII codé sur 7 bits restent encore très répandus lorsque les textes à coder ne nécessitent qu'un alphabet simple. Cependant, seul le second (US-ASCII) est totalement compatible (dans son codage comme dans son interprétation) avec la représentation binaire UTF-8 normalisée pour le jeu de caractères universel ISO/CEI/Unicode.
Le jeu universel des normes ISO/CEI/Unicode n’est pas le seul (même si c’est aujourd’hui celui qui est le plus répandu et le mieux supporté partout dans le monde sur de très nombreux logiciels, car demandé aujourd'hui pour tous les nouveaux protocoles de l’Internet approuvés par l'IETF, et approuvé par la plupart des organismes de normalisation nationaux ou privés) : d’autres jeux universels ont été normalisés notamment en Asie orientale (tel que GB18030 en Chine, qui est également totalement compatible avec US-ASCII mais qui a l’avantage de n’avoir qu’une seule représentation binaire et ne nécessite donc aucune inclusion d’un caractère BOM).
De 2010 à 2016, ISO-8859-1/Windows-1252 perd de l'importance au profit d'UTF8 :
| Pour des raisons techniques, il est temporairement impossible d'afficher le graphique qui aurait dû être présenté ici. | Source |