Aller au contenu

Partie 5 : Représentation des textes en machine


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.


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.).
CodeCaractèreCodeCaractèreCodeCaractère
32(espace)48065A
33!49166B
34"50267C
42*57990Z
43+58:97a
44,59;98b
45-60<99c
46.61=122z
47/63?123{

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.


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.
CodeCaractèreCodeCaractère
192À233é
199Ç234ê
200È235ë
201É238î
224à244ô
226â249ù
231ç252ü
232è255ÿ

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).


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 codeCaractèreDescription
U+0041ALettre A majuscule
U+00E9éLettre e accent aigu
U+03B1αLettre alpha grecque
U+4E2D中Caractère chinois « milieu »
U+1F600😀Emoji visage souriant

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 codesNombre d'octetsExemples
U+0000 à U+007F1 octetCaractères ASCII (a-z, A-Z, 0-9, ponctuation)
U+0080 à U+07FF2 octetsCaractères accentués (é, è, ê, ñ, ü...)
U+0800 à U+FFFF3 octetsIdéogrammes chinois, japonais, coréens
U+10000 à U+10FFFF4 octetsEmojis, caractères rares

Il existe d'autres formats de stockage pour Unicode :

EncodageTaille par caractèreUsage
UTF-81 à 4 octets (variable)Web, fichiers texte, Linux, macOS
UTF-162 ou 4 octetsWindows (interne), Java, JavaScript
UTF-324 octets (fixe)Rare, traitement interne

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 originalEncodage d'écritureEncodage de lectureRésultat affiché
« Éducation »UTF-8Latin-1« Éducation »
« Éducation »Latin-1UTF-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.

  • 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.

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 !
'😀'
mot = "Bonjour"
for caractere in mot:
print(caractere, "->", ord(caractere))

Résultat :

B -> 66
o -> 111
n -> 110
j -> 106
o -> 111
u -> 117
r -> 114

6.3 Conversion majuscule/minuscule par le code ASCII

Section intitulée « 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)
# É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

EncodageDateBits par caractèreNombre de caractèresCouverture
ASCII19637128Anglais uniquement
ISO-8859-1 (Latin-1)19868256Europe de l'Ouest
Unicode (UTF-8)19918 à 32 (variable)150 000+Toutes les langues
ConceptDétail
EncodageAssociation entre caractères et nombres
ASCIIPremier standard, 128 caractères, pas d'accents
Latin-1Extension de l'ASCII, 256 caractères, accents européens
UnicodeCatalogue universel de tous les caractères du monde
UTF-8Encodage à 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 pratiqueToujours utiliser UTF-8