Chapitre 5 : Représentation des textes en machine¶
Programme officiel (B.O.)¶
B.O. spécial n° 1 du 22 janvier 2019 - NSI Première
| Contenus | Capacités attendues | Commentaires |
|---|---|---|
| Représentation d'un texte en machine. Exemples des encodages ASCII, ISO-8859-1, Unicode | Identifier l'intérêt des différents systèmes d'encodage. Convertir un fichier texte dans différents formats d'encodage. | Aucune connaissance précise des normes d'encodage n'est exigible. |
1. Du texte aux nombres¶
Un ordinateur ne sait manipuler que des nombres binaires. Pour stocker du texte, il faut donc associer un nombre unique à chaque caractère (lettre, chiffre, ponctuation, espace, etc.). Cette association s'appelle un encodage (ou encoding en anglais).
Un encodage est un tableau de correspondance : à chaque caractère est attribué un numéro, appelé point de code.
À retenir
Un fichier texte ne contient que des nombres. C'est le logiciel qui le lit (éditeur de texte, navigateur, terminal) qui interprète ces nombres comme des caractères grâce à l'encodage choisi.
2. Le code ASCII (1963)¶
2.1 Principe¶
L'ASCII (American Standard Code for Information Interchange) est le premier encodage standardisé, créé en 1963 aux États-Unis.
Caractéristiques :
- Chaque caractère est codé sur 7 bits ;
- Cela permet 2⁷ = 128 caractères différents (de 0 à 127) ;
- Il couvre les lettres de l'alphabet latin non accentuées (a-z, A-Z), les chiffres (0-9), les signes de ponctuation et des caractères de contrôle (retour à la ligne, tabulation, etc.).
2.2 Extrait de la table ASCII¶
| Code | Caractère | Code | Caractère | Code | Caractère | ||
|---|---|---|---|---|---|---|---|
| 32 | (espace) | 48 | 0 |
65 | A |
||
| 33 | ! |
49 | 1 |
66 | B |
||
| 34 | " |
50 | 2 |
67 | C |
||
| 42 | * |
57 | 9 |
90 | Z |
||
| 43 | + |
58 | : |
97 | a |
||
| 44 | , |
59 | ; |
98 | b |
||
| 45 | - |
60 | < |
99 | c |
||
| 46 | . |
61 | = |
122 | z |
||
| 47 | / |
63 | ? |
123 | { |
Propriétés utiles de la table ASCII
- Les chiffres
0à9ont les codes 48 à 57 (consécutifs). - Les majuscules
AàZont les codes 65 à 90 (consécutifs). - Les minuscules
aàzont les codes 97 à 122 (consécutifs). - L'écart entre une majuscule et sa minuscule est toujours de 32 (par exemple,
A= 65 eta= 97).
2.3 Limites de l'ASCII¶
L'ASCII a été conçu pour l'anglais. Il ne contient aucun caractère accentué (é, è, ê, à, ù, ç...) ni aucun caractère d'autres alphabets (chinois, arabe, grec, cyrillique...).
Avec seulement 128 caractères, il est très insuffisant pour représenter les textes de la plupart des langues du monde.
3. ISO-8859-1, dit « Latin-1 » (1986)¶
3.1 Principe¶
Pour résoudre le problème des caractères accentués des langues d'Europe occidentale, la norme ISO-8859-1 (aussi appelée Latin-1) a été créée en 1986.
Caractéristiques :
- Chaque caractère est codé sur 8 bits (1 octet) ;
- Cela permet 2⁸ = 256 caractères différents (de 0 à 255) ;
- Les 128 premiers codes (0 à 127) sont identiques à l'ASCII : Latin-1 est compatible avec ASCII ;
- Les codes 128 à 255 ajoutent les caractères accentués et spéciaux des langues d'Europe de l'Ouest : é, è, ê, ë, à, ù, ç, ñ, ü, ö, ß, £, etc.
3.2 Exemples de codes Latin-1¶
| Code | Caractère | Code | Caractère | |
|---|---|---|---|---|
| 192 | À | 233 | é | |
| 199 | Ç | 234 | ê | |
| 200 | È | 235 | ë | |
| 201 | É | 238 | î | |
| 224 | à | 244 | ô | |
| 226 | â | 249 | ù | |
| 231 | ç | 252 | ü | |
| 232 | è | 255 | ÿ |
3.3 Limites de l'ISO-8859-1¶
Avec 256 caractères, Latin-1 couvre le français, l'espagnol, l'allemand, le portugais, etc. Mais il ne couvre pas :
- Les caractères du polonais, du tchèque, du hongrois (qui ont leurs propres variantes ISO-8859-2, ISO-8859-3, etc.) ;
- Les alphabets non latins : grec, cyrillique, arabe, hébreu ;
- Les idéogrammes chinois, japonais, coréens ;
- Les emojis.
Résultat : chaque région du monde avait son propre encodage, et les textes échangés entre pays étaient souvent illisibles (caractères remplacés par des symboles bizarres).
4. Unicode et UTF-8 (1991)¶
4.1 Unicode : un catalogue universel¶
Unicode a été créé en 1991 pour résoudre définitivement le problème : il attribue un numéro unique (appelé point de code) à chaque caractère de chaque langue du monde.
Quelques chiffres :
- La version actuelle d'Unicode définit plus de 150 000 caractères ;
- Il couvre 161 écritures différentes (latin, grec, cyrillique, arabe, chinois, japonais, etc.) ;
- Il inclut aussi les symboles mathématiques, les emojis, les caractères historiques, etc.
Les points de code Unicode sont notés U+ suivi du code en hexadécimal :
| Point de code | Caractère | Description |
|---|---|---|
| U+0041 | A | Lettre A majuscule |
| U+00E9 | é | Lettre e accent aigu |
| U+03B1 | α | Lettre alpha grecque |
| U+4E2D | 中 | Caractère chinois « milieu » |
| U+1F600 | 😀 | Emoji visage souriant |
À retenir
Unicode n'est pas un encodage : c'est un catalogue qui numérote les caractères. L'encodage (la façon de stocker ces numéros en mémoire) est une question séparée. Le format de stockage le plus courant est UTF-8.
4.2 UTF-8 : l'encodage dominant¶
UTF-8 (Unicode Transformation Format - 8 bits) est l'encodage le plus utilisé dans le monde (plus de 98 % des pages Web). Son principe est astucieux : le nombre d'octets utilisés varie selon le caractère :
| Plage de codes | Nombre d'octets | Exemples |
|---|---|---|
| U+0000 à U+007F | 1 octet | Caractères ASCII (a-z, A-Z, 0-9, ponctuation) |
| U+0080 à U+07FF | 2 octets | Caractères accentués (é, è, ê, ñ, ü...) |
| U+0800 à U+FFFF | 3 octets | Idéogrammes chinois, japonais, coréens |
| U+10000 à U+10FFFF | 4 octets | Emojis, caractères rares |
Avantages de l'UTF-8
- Compatible avec l'ASCII : un texte ASCII est automatiquement un texte UTF-8 valide.
- Économe : les caractères courants (lettres latines) ne prennent qu'un octet.
- Universel : il peut représenter tous les caractères Unicode.
- Standard du Web : c'est l'encodage par défaut de HTML5.
4.3 Autres encodages Unicode¶
Il existe d'autres formats de stockage pour Unicode :
| Encodage | Taille par caractère | Usage |
|---|---|---|
| UTF-8 | 1 à 4 octets (variable) | Web, fichiers texte, Linux, macOS |
| UTF-16 | 2 ou 4 octets | Windows (interne), Java, JavaScript |
| UTF-32 | 4 octets (fixe) | Rare, traitement interne |
5. Les problèmes d'encodage¶
5.1 Les « caractères bizarres »¶
Quand un texte est enregistré dans un encodage et lu dans un autre, les caractères accentués sont remplacés par des séquences étranges :
| Texte original | Encodage d'écriture | Encodage de lecture | Résultat affiché |
|---|---|---|---|
| « Éducation » | UTF-8 | Latin-1 | « Éducation » |
| « Éducation » | Latin-1 | UTF-8 | « erreur ou ? » |
Ces problèmes sont la cause de nombreux affichages cassés sur les sites Web, dans les emails ou dans les fichiers CSV.
5.2 Comment les éviter ?¶
- Toujours utiliser UTF-8 dans les nouveaux projets ;
- Préciser l'encodage dans les fichiers HTML :
<meta charset="utf-8">; - En Python, préciser l'encodage à l'ouverture d'un fichier.
6. En Python¶
6.1 Les fonctions ord() et chr()¶
Python fournit deux fonctions pour passer d'un caractère à son code et inversement :
>>> ord('A') # code du caractère 'A'
65
>>> ord('é') # code Unicode de 'é'
233
>>> chr(65) # caractère de code 65
'A'
>>> chr(233) # caractère de code 233
'é'
>>> chr(128512) # un emoji !
'😀'
6.2 Parcourir une chaîne et ses codes¶
Résultat :
6.3 Conversion majuscule/minuscule par le code ASCII¶
Puisque l'écart entre une majuscule et sa minuscule est de 32 :
def en_minuscule(caractere):
"""Convertit une lettre majuscule en minuscule."""
code = ord(caractere)
if 65 <= code <= 90:
return chr(code + 32)
return caractere
print(en_minuscule('H')) # 'h'
print(en_minuscule('z')) # 'z' (déjà en minuscule)
6.4 Lire et écrire des fichiers avec un encodage¶
# Écriture en UTF-8
with open("texte.txt", "w", encoding="utf-8") as fichier:
fichier.write("Bonjour, ça va ?")
# Lecture en UTF-8
with open("texte.txt", "r", encoding="utf-8") as fichier:
contenu = fichier.read()
print(contenu)
# Lecture en Latin-1 (erreur d'interprétation si le fichier est en UTF-8)
with open("texte.txt", "r", encoding="latin-1") as fichier:
contenu = fichier.read()
print(contenu) # les accents seront mal affichés
7. Résumé¶
| Encodage | Date | Bits par caractère | Nombre de caractères | Couverture |
|---|---|---|---|---|
| ASCII | 1963 | 7 | 128 | Anglais uniquement |
| ISO-8859-1 (Latin-1) | 1986 | 8 | 256 | Europe de l'Ouest |
| Unicode (UTF-8) | 1991 | 8 à 32 (variable) | 150 000+ | Toutes les langues |
| Concept | Détail |
|---|---|
| Encodage | Association entre caractères et nombres |
| ASCII | Premier standard, 128 caractères, pas d'accents |
| Latin-1 | Extension de l'ASCII, 256 caractères, accents européens |
| Unicode | Catalogue universel de tous les caractères du monde |
| UTF-8 | Encodage à taille variable, compatible ASCII, standard du Web |
Python : ord() |
Renvoie le code d'un caractère |
Python : chr() |
Renvoie le caractère d'un code |
| Bonne pratique | Toujours utiliser UTF-8 |