KlarIA
💻 NSI (spécialité)1ereCours

Représentation d'un texte en machine

📖

Cours

Représentation d'un texte en machine

Pour l'ordinateur, un texte est une suite de nombres : à chaque caractère correspond un code, stocké sur un ou plusieurs octets.

La table qui associe caractères et codes s'appelle un encodage. Il en existe plusieurs, nés à des époques différentes : ASCII, ISO-8859-1, puis Unicode et son encodage UTF-8.

Comprendre ces encodages, c'est comprendre pourquoi un accent devient parfois « é », et comment convertir un fichier d'un format à l'autre.

1. ASCII : le point de départ

1.1 Une table de 128 caractères

CodesContenu
00 à 3131caractères de contrôle : tabulation (99), saut de ligne (1010), retour chariot (1313)
3232espace
3333 à 4747ponctuation : ! (3333), , (4444), . (4646)
4848 à 5757chiffres 0 à 9
6565 à 9090majuscules A (6565) à Z (9090)
9797 à 122122minuscules a (9797) à z (122122)

En Python, ord donne le code d'un caractère, et chr fait l'inverse.

Un caractère ASCII tient sur un octet dont le bit de poids fort vaut 00.

1.2 Une application : le chiffrement de César

Puisque les lettres sont des nombres, on peut calculer avec. Le chiffrement de César décale chaque lettre de d positions dans l'alphabet.

1.3 Les limites

2. ISO-8859-1 : un octet complet

Avec le 8e bit, on dispose de 256256 codes.

Un caractère occupe toujours un octet : cela reste simple.

3. Unicode et UTF-8 : un code pour tous les caractères

3.1 Unicode : le répertoire

Plus de 150000150\,000 caractères sont définis. Les 128128 premiers points de code sont ceux de l'ASCII, les 256256 premiers ceux d'ISO-8859-1.

3.2 UTF-8 : un encodage à longueur variable

UTF-8 code chaque point de code sur 1 à 4 octets, selon sa taille.

Point de codeOctetsForme binaireExemples
U+0000 à U+007F110xxxxxxxASCII : A, 1, !
U+0080 à U+07FF22110xxxxx 10xxxxxxé, ç, grec, cyrillique
U+0800 à U+FFFF331110xxxx 10xxxxxx 10xxxxxx, chinois, japonais
U+10000 à U+10FFFF4411110xxx 10xxxxxx 10xxxxxx 10xxxxxxémojis 😀

Les bits de préfixe du premier octet (0, 110, 1110, 11110) annoncent la longueur. Chaque octet de continuation commence par 10. Les x reçoivent les bits du point de code.

Vérifions, et regardons les octets d'autres caractères.

3.3 Pourquoi UTF-8 s'est imposé

AtoutExplication
compatible ASCIIun texte ASCII est déjà de l'UTF-8 valide : un seul octet, bit de poids fort à 00
universeltous les caractères de toutes les langues, sans variantes régionales
compactpour les langues latines, surtout des caractères à 11 ou 22 octets
robusteun octet 10xxxxxx est toujours une continuation : on se resynchronise facilement

Plus de 98%98\,\% des pages web sont en UTF-8. C'est l'encodage par défaut de Python 3, du HTML5, de Linux et de macOS.

Trois encodages comparés

4. Erreurs d'encodage et conversions

4.1 Le mojibake

Si un programme lit des octets UTF-8 en croyant à de l'ISO-8859-1, chaque caractère accentué, codé sur deux octets, devient deux caractères.

Ainsi é =C3 A9= \overline{\text{C3 A9}} s'affiche « é », d'où « café » ou « élève ». Ces caractères parasites s'appellent du mojibake.

Dans l'autre sens, l'octet E9\overline{\text{E9}} d'un fichier Latin-1 lu en UTF-8 n'est pas une séquence valide : le programme affiche « � », ou s'arrête sur une erreur.

4.2 Encoder, décoder

>>> "café".encode("utf-8")
b'caf\xc3\xa9'
>>> "café".encode("latin-1")
b'caf\xe9'
>>> b'caf\xc3\xa9'.decode("utf-8")
'café'
>>> b'caf\xc3\xa9'.decode("latin-1")
'café'

La dernière ligne décode avec le mauvais encodage : c'est exactement ainsi que naît le mojibake. Fabrique le tien.

4.3 Convertir un fichier

Les éditeurs de texte affichent l'encodage en bas de la fenêtre et proposent « réenregistrer avec l'encodage… ». Une page web déclare le sien avec <meta charset="utf-8">.

4.4 Taille d'un texte

La taille en octets est la somme des tailles des caractères.

Un roman de 500000500\,000 caractères en français pèse environ 510510 ko en UTF-8, car environ 2%2\,\% des lettres sont accentuées. Il pèserait 11 Mo en UTF-16, à 22 octets par caractère.

5. Exemple résolu pas à pas

Correction · Question a

A =65= 65, donc G =65+6=71=10001112= 65 + 6 = 71 = \overline{100\,0111}^{\,2}.
g =71+32=103=11001112= 71 + 32 = 103 = \overline{110\,0111}^{\,2}.

Correction · Question b

En ISO-8859-1, un octet par caractère : N =78=4E= 78 = \overline{\text{4E}}, o =111=6F= 111 = \overline{\text{6F}}, ë =235=EB= 235 = \overline{\text{EB}}, l =108=6C= 108 = \overline{\text{6C}}.
Soit 4E 6F EB 6C : 44 octets.
En UTF-8, N, o et l sont inchangés. Pour ë : 235=111010112235 = \overline{1110\,1011}^{\,2} est entre 128128 et 20472\,047, il faut 22 octets.
Les bits complétés 00011101011000\,1110\,1011 se répartissent en 110 00011 et 10 101011, soit C3 AB.
Résultat : 4E 6F C3 AB 6C, soit 55 octets.

Correction · Question c

Les octets C3 et AB sont lus séparément, comme les caractères Latin-1 de codes 195195 (Ã) et 171171 («).
On affiche « Noël ».

Correction · Question d

Le programme affiche 4 5 : quatre caractères, mais cinq octets, car ë occupe deux octets en UTF-8.

Vérifie les quatre réponses :

À retenir

Révise ce chapitre avec KlarIA

Tuteur qui t'explique pas à pas, quiz pour t'entraîner, flashcards pour mémoriser. Gratuit.

Créer mon compte gratuitement