Informatique · Première · 4 min de lecture
Encoder un texte : ASCII, Latin-1 et UTF-8
Un texte est une suite de caractères, chacun codé par un nombre : ASCII code 128 caractères sur 7 bits, sans lettres accentuées ; ISO-8859-1 (Latin-1) étend à 256 caractères sur un octet ; Unicode attribue un numéro (point de code) à chaque caractère de toutes les écritures, et UTF-8 l'écrit sur 1 à 4 octets en restant compatible avec ASCII ; un fichier lu avec un autre encodage que celui de son écriture affiche des caractères erronés.
Chapitre du programme : Numérique et sciences informatiques (spécialité)
Bloc 1 sur 7 · Comprendre
Comprendre : un caractère est un nombre
Une machine ne stocke que des nombres. Pour stocker un texte, on attribue un numéro à chaque caractère, puis on écrit ce numéro en binaire. Une table qui fait correspondre caractères et numéros, avec une façon de les écrire en octets, est un encodage.
- ASCII (années 1960) numérote 128 caractères sur 7 bits : lettres non accentuées, chiffres, ponctuation, espace. Aucune lettre accentuée.
- ISO-8859-1 (ou Latin-1) étend l'ASCII à 256 caractères, sur un octet : il ajoute é, è, ç, à… Mais pas le symbole €, ni la plupart des écritures du monde.
- Unicode attribue des points de code aux éléments d’un vaste répertoire d’écritures et de symboles, enrichi au fil des versions. UTF-8 est la façon la plus répandue d'écrire ces numéros en octets.
En Python, ord donne le point de code d'un caractère et chr le caractère d'un point de code :
print(ord("A"), ord("é"), ord("€"))
print(chr(97))65 233 8364
aBloc 2 sur 7 · Approfondir
Approfondir : UTF-8, de 1 à 4 octets
UTF-8 utilise un nombre variable d'octets par valeur scalaire Unicode : un caractère perçu peut être une séquence de plusieurs points de code. Pour les caractères précomposés des exemples :
- 1 octet pour les 128 caractères de l'ASCII : un texte ASCII est donc déjà un texte UTF-8 valide (compatibilité) ;
- 2 octets pour la plupart des lettres accentuées (é, è, ç, ô…) et pour œ ;
- 3 octets pour des caractères comme € ;
- 4 octets pour d'autres caractères, comme de nombreux émojis.
for mot in ["chat", "été", "cœur", "5 €"]:
print(mot, len(mot), len(mot.encode("utf-8")))chat 4 4
été 3 5
cœur 4 5
5 € 3 5len(mot) compte les points de code de la chaîne, len(mot.encode("utf-8")) les octets : « été » a 3 caractères mais occupe 5 octets (2 + 1 + 2).
Un même caractère perçu peut avoir plusieurs représentations : é précomposé compte un point de code, tandis que e suivi d’un accent combinant en compte deux. Les longueurs annoncées ici utilisent les formes précomposées écrites dans les exemples.
Dans le tableau, ASCII utilise un octet de stockage dont sept bits portent le code ; UTF-8 utilise un à quatre octets par valeur scalaire Unicode encodable, et non par caractère perçu.
Un texte lu avec le mauvais encodage. Si l'on écrit « été » en UTF-8 puis qu'on relit les octets comme du Latin-1, chaque é (2 octets) devient deux caractères :
print("été".encode("utf-8").decode("latin-1"))étéC'est l'origine des « é » qu'on rencontre parfois sur des pages Web ou dans des fichiers.
Bloc 3 sur 7 · Exemple
Exemple guidé : la taille de « garçon » en UTF-8
Énoncé. Combien d'octets occupe le mot « garçon » encodé en UTF-8 ?
- Il compte 6 caractères : g, a, r, ç, o, n.
- g, a, r, o, n sont des caractères ASCII : 1 octet chacun, soit 5 octets.
- ç n'est pas un caractère ASCII : il occupe 2 octets en UTF-8.
- Total : 5 + 2 = 7 octets.
En ISO-8859-1, le même mot occuperait 6 octets (un par caractère) ; en ASCII, il ne pourrait pas être écrit, faute de ç.
Bloc 4 sur 7 · Visualiser
Voir : trois encodages comparés
| ASCII | ISO-8859-1 (Latin-1) | UTF-8 | |
|---|---|---|---|
| Nombre de caractères | 128 | 256 | vaste répertoire Unicode |
| Octets par point de code encodable | 1 (7 bits utiles) | 1 | de 1 à 4 |
| é, ç, à | non | oui (1 octet) | oui (2 octets) |
| € | non | non | oui (3 octets) |
| Compatible avec ASCII | — | oui | oui |
Continuez sur votre lancée
Vous avez découvert l’essentiel et un exemple. Retrouvez la suite du cours et les points à retenir, puis passez à l’entraînement guidé dans votre compte.
- Les formules et les repères à retenir
- Les erreurs fréquentes expliquées
- Un exercice avec des aides et sa correction
L’accès gratuit comprend les cours et exercices de votre niveau choisi.
Sources
- BO spécial n°1 du 22 janvier 2019 — programme de spécialité numérique et sciences informatiques de première, « Représentation d'un texte en machine »
- RFC 3629, UTF-8, a transformation format of ISO 10646, IETF, 2003 (https://www.rfc-editor.org/rfc/rfc3629)
- The Unicode Standard, Version 15.0, The Unicode Consortium (https://www.unicode.org/versions/Unicode15.0.0/)
Vous pensez avoir trouvé une erreur dans cette leçon ? Signalez-la par e-mail.