Un cap pour ce chapitre
Ce que vous saurez faire
- Distinguer caractère point de code et octets encodés
- Comparer les possibilités de ASCII ISO-8859-1 et Unicode
- Expliquer une conversion de fichier texte
Les bases utiles pour commencer
Le caractère et sa représentation sont distincts
Un caractère est une unité de texte telle que A ou é. Unicode associe des points de code à un très grand ensemble de caractères ; on les note souvent U+ suivi d’une valeur hexadécimale. Un encodage comme UTF-8 transforme ces points de code en octets. Unicode n’est donc pas simplement un format où chaque caractère occuperait la même taille. Une apparence visuelle peut même résulter de plusieurs points de code, par exemple une lettre suivie d’un accent combinant. Pour commencer, les exemples de cette page utilisent des caractères précomposés simples.
Compter les lettres visibles, les points de code et les octets répond à trois questions différentes. Pour les exemples simples de cette page, chaque caractère précomposé correspond à un point de code. Cette simplification doit être gardée à l’esprit avant de généraliser à tous les textes et symboles.
Des répertoires adaptés à des besoins différents
ASCII définit 128 positions et couvre notamment les lettres latines non accentuées, les chiffres et des caractères de contrôle. Il ne permet pas de représenter directement é. ISO-8859-1 utilise un octet et ajoute notamment de nombreuses lettres accentuées d’Europe occidentale. Il ne contient pas tous les alphabets ni tous les symboles, par exemple l’euro. UTF-8 encode Unicode avec un nombre variable d’octets et conserve les codes ASCII sur un octet. Son intérêt est de permettre des textes multilingues sans imposer une convention distincte pour chaque langue.
Le fait qu’un encodage utilise un octet ne signifie pas qu’il couvre tous les caractères possibles. Un octet possède seulement 256 configurations. Un répertoire multilingue plus vaste demande donc plusieurs octets pour certains caractères ou une autre organisation de la représentation.
Décoder avec la même convention
Le caractère é est représenté par l’octet E9 en ISO-8859-1, et par les deux octets C3 A9 en UTF-8. Si l’on interprète C3 A9 comme deux caractères ISO-8859-1, on obtient é. Les données ne sont pas nécessairement perdues : le programme peut simplement avoir choisi le mauvais décodeur. À l’inverse, lire un octet E9 isolé comme UTF-8 provoque normalement une erreur car cette séquence n’est pas valide. Remplacer silencieusement les erreurs peut cacher la cause et rendre une récupération plus difficile.
Un texte déformé peut encore être composé de caractères parfaitement valides. L’absence d’erreur technique ne garantit donc pas que le lecteur a utilisé la bonne convention. Comparez les octets d’origine, l’encodage annoncé et les caractères attendus avant de corriger le fichier.
Convertir implique décoder puis réencoder
Changer le nom d’un fichier ou son extension ne convertit pas son contenu. Il faut lire ses octets avec l’encodage source, obtenir les caractères, puis écrire ces caractères avec l’encodage cible. En Python, on peut préciser encoding dans open. Une conversion vers un répertoire plus restreint peut échouer : un texte contenant un caractère absent d’ASCII n’a pas de conversion fidèle vers ASCII sans transformation supplémentaire. Le programme n’exige pas de mémoriser tous les codes ; l’objectif est de comprendre la convention, ses possibilités et les causes des erreurs.
Pour reproduire cet exemple, le fichier source.txt contient le texte « été » en ISO-8859-1, soit les trois octets E9 74 E9 en hexadécimal. La copie UTF-8 attendue contient C3 A9 74 C3 A9. Le fichier original est seulement lu ; la conversion écrit un autre fichier nommé copie.txt.
with open("source.txt", encoding="iso-8859-1") as fichier:
texte = fichier.read()
with open("copie.txt", "w", encoding="utf-8") as fichier:
fichier.write(texte)Une conversion fidèle conserve la suite de caractères, mais peut changer la taille du fichier. Il faut aussi distinguer les octets du texte des octets éventuels de fin de ligne. Les comptages de cette page excluent toute fin de ligne ajoutée automatiquement par un éditeur.
Vérifier une conversion par étapes
Le texte précomposé « café » contient quatre caractères. Les trois premières lettres sont ASCII et occupent chacune un octet en ASCII, ISO-8859-1 ou UTF-8. La dernière lettre utilise un octet en ISO-8859-1 et deux en UTF-8. Le texte demande donc quatre octets dans le premier encodage et cinq dans le second, sans fin de ligne.
Une conversion correcte lit d’abord les quatre octets source pour retrouver les quatre caractères, puis produit cinq octets UTF-8. Comparer seulement la taille ne suffit pas : plusieurs textes différents ont la même taille. Relire la copie dans l’encodage cible permet de vérifier la conservation du texte.
Choisir entre fidélité et transformation explicite
Un texte contenant « 5 € » peut être conservé en UTF-8. Le symbole euro utilise trois octets, tandis que le chiffre et l’espace en utilisent chacun un : le total est cinq. ASCII ne contient pas le symbole euro. Remplacer celui-ci par « EUR » produit un autre texte, même si le sens commercial reste compréhensible.
Cette transformation doit donc être annoncée dans le contrat d’export. Supprimer silencieusement les caractères non représentables pourrait transformer un nom ou une information importante. Le choix d’un encodage capable de représenter toutes les données évite cette perte sans exiger de mémoriser les codes numériques de chaque caractère.
À vous de faire varier les choses
Voyez les octets derrière les lettres
Choisissez un texte et un encodage. Comparez points de code, octets et caractères qui ne peuvent pas être représentés.
Lire le résultat de l’expérience initiale
Texte représentable sur 5 octet(s)
Les octets sont affichés en hexadécimal ; ils ne constituent pas un autre texte.
| Caractère | Point de code | Octets |
|---|---|---|
| é | U+00E9 | C3 A9 |
| t | U+0074 | 74 |
| é | U+00E9 | C3 A9 |
La même lettre peut produire des octets différents. Un texte mal affiché demande d’examiner la convention de lecture avant de modifier les caractères.
De la compréhension à l’autonomie
À vous de résoudre
Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.
Compter les octets
Le texte « été » contient trois caractères précomposés. Combien d’octets utilise-t-il en ISO-8859-1 et en UTF-8, sachant que é utilise respectivement un et deux octets ?
Indice 1
La lettre t utilise un octet dans les deux encodages.
Indice 2
Le texte contient deux occurrences de é.
Comprendre la correction
ISO-8859-1 utilise trois octets : un pour chaque caractère. UTF-8 en utilise cinq : deux pour le premier é, un pour t et deux pour le dernier é. Le nombre de caractères n’est donc pas nécessairement égal à la taille en octets du fichier.
Comprendre le texte déformé
Un fichier UTF-8 contenant é est relu en ISO-8859-1 et affiche é. À quel moment l’erreur apparaît-elle, et quelle correction essayer en premier ?
Indice 1
Les octets écrits sont C3 A9.
Indice 2
Le lecteur les interprète séparément avec une autre table.
Comprendre la correction
L’erreur apparaît lors du décodage : les octets UTF-8 sont interprétés comme deux caractères ISO-8859-1. Il faut d’abord relire le fichier original avec UTF-8. Remplacer manuellement chaque affichage déformé risque de masquer le problème et de détériorer des données qui étaient encore correctement encodées.
Une conversion impossible à l’identique
Pourquoi un texte contenant € ne peut-il pas être enregistré fidèlement en ASCII ? Proposez deux décisions possibles selon le besoin.
Indice 1
Le répertoire ASCII est limité à 128 positions.
Indice 2
Une transformation du texte n’est pas une conversion sans perte.
Comprendre la correction
ASCII ne contient pas le symbole €. On peut conserver le texte en UTF-8, ou décider explicitement de remplacer le symbole par le mot EUR si l’application l’autorise. La seconde solution modifie le texte : elle ne doit pas être présentée comme une conversion identique. Le choix dépend du service attendu.
La fausse conversion
Un élève renomme donnees-latin1.txt en donnees-utf8.txt. Pourquoi cela ne convertit-il pas le texte ? Décrivez les étapes correctes.
Indice 1
Le nom du fichier n’est pas son contenu binaire.
Indice 2
Il faut passer par les caractères entre les deux représentations.
Comprendre la correction
Le renommage conserve exactement les mêmes octets. Il faut décoder le contenu en ISO-8859-1 pour retrouver les caractères, puis encoder ces caractères en UTF-8 et écrire les nouveaux octets. Pour é, la conversion remplace ainsi E9 par C3 A9. Préciser les encodages évite de dépendre d’un réglage implicite de la machine.
Compter sans confondre les unités
Le texte « café » est composé de caractères précomposés. Les lettres c, a et f utilisent un octet dans les deux encodages ; é en utilise un en ISO-8859-1 et deux en UTF-8. Donnez les tailles sans fin de ligne et le nombre de caractères après conversion.
Indice 1
Les caractères sont conservés, leurs octets changent.
Indice 2
Additionnez séparément les tailles de chaque encodage.
Comprendre la correction
Le texte contient toujours quatre caractères. Il occupe quatre octets en ISO-8859-1 et cinq en UTF-8. La conversion change la représentation du dernier caractère sans ajouter une lettre au texte. Une taille de cinq octets ne signifie donc pas que la copie contient cinq caractères.
Une exportation avec un symbole absent
On exporte « 5 € » sans fin de ligne. Le chiffre et l’espace utilisent chacun un octet UTF-8 ; l’euro en utilise trois. Calculez la taille, puis expliquez pourquoi remplacer € par EUR constitue une transformation. Quel encodage de l’atelier permet de conserver le symbole ?
Indice 1
Une conversion fidèle conserve les caractères.
Indice 2
ASCII et ISO-8859-1 ne possèdent pas le symbole euro.
Comprendre la correction
La taille UTF-8 vaut cinq octets. Remplacer le symbole par trois lettres peut convenir à un besoin annoncé, mais change la suite de caractères. UTF-8 permet de conserver exactement le texte original. Le comptage des octets et la fidélité sont des propriétés distinctes : deux versions peuvent avoir la même taille et un texte différent.
Diagnostiquer avant de réenregistrer
Un fichier contient les octets C3 A9, annoncés comme UTF-8. Un lecteur affiche é. Décrivez la chaîne correcte, localisez l’erreur probable et expliquez pourquoi réenregistrer immédiatement le texte affiché pourrait compliquer la récupération.
Indice 1
Les deux octets forment ensemble le caractère é en UTF-8.
Indice 2
Un mauvais décodage peut créer deux caractères valides mais erronés.
Comprendre la correction
La chaîne correcte décode C3 A9 en un seul caractère é. Le lecteur a probablement interprété séparément les octets dans une autre convention. Il faut relire l’original en UTF-8. Réenregistrer é encoderait les mauvais caractères et créerait une nouvelle représentation du texte déformé, au lieu de corriger le décodage initial.
Les erreurs qui méritent un détour
- Affirmer qu’un caractère vaut toujours un octet
- La taille dépend de l’encodage et du caractère ; UTF-8 utilise une longueur variable.
- Confondre Unicode et UTF-8
- Unicode définit notamment des points de code ; UTF-8 est une manière de les représenter en octets.
La fiche à garder
L’essentiel à retenir
- Le décodage doit correspondre à l’encodage utilisé à l’écriture.
- Une conversion fidèle doit pouvoir représenter tous les caractères.
- Le nom du
fichierne change pas ses octets.
Cette notion au bac
Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.
Le prochain pas
Retrouver le catalogue de Première
Ce chapitre s’appuie sur le programme officiel de Première (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.
