Aller au contenu

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 à 9 ont les codes 48 à 57 (consécutifs).
  • Les majuscules A à Z ont les codes 65 à 90 (consécutifs).
  • Les minuscules a à z ont les codes 97 à 122 (consécutifs).
  • L'écart entre une majuscule et sa minuscule est toujours de 32 (par exemple, A = 65 et a = 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

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

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