NSI (Spé) — Représentation des données
Représentation des textes
Encodage des caractères : ASCII, Unicode, UTF-8
Résumé synthétiqueFiche en 4 sectionsQuiz de 10 questionsGratuit, sans pub
Résumé
Les caractères sont représentés en machine par des nombres, selon un encodage. La table ASCII (1963) code 128 caractères sur 7 bits : A-Z (65-90), a-z (97-122), 0-9 (48-57) et des symboles ; mais elle ignore les accents et les écritures non latines. Unicode est un standard universel qui attribue un numéro unique (code point) à plus de 140 000 caractères de toutes les langues. UTF-8 est l'encodage le plus répandu sur le Web : il code l'ASCII sur 1 octet et le reste sur 2 à 4 octets, donc il reste compatible ASCII. En Python, ord('A') renvoie 65 et chr(65) renvoie 'A'. Les caractères illisibles (le mojibake) apparaissent quand on lit un fichier avec un encodage différent de celui de l'écriture.
Un caractère n'a pas de sens pour une machine : il faut lui associer un nombre. La table ASCII établit cette correspondance pour 128 caractères de l'alphabet anglais, codés sur 7 bits. C'est la base historique de tous les encodages modernes.
Un caractère est associé à un code (ici A vaut 65), lui-même stocké en binaire sur un ou plusieurs octets.
- Définition : ASCII = American Standard Code for Information Interchange (1963).
- Taille : 128 caractères codés sur 7 bits (codes 0 à 127).
- Lettres : A vaut 65 et Z vaut 90 ; a vaut 97 et z vaut 122 (décalage de 32 entre maj. et min.).
- Chiffres : le caractère '0' vaut 48 et '9' vaut 57 — attention, le caractère '0' n'est pas l'entier 0.
- Symboles : espace = 32, tabulation = 9, retour à la ligne = 10.
Exemple
Le mot 'Bac' s'encode en ASCII par les codes 66 ('B'), 97 ('a'), 99 ('c'). Le décalage de 32 fait passer d'une majuscule à sa minuscule : 'A' (65) + 32 = 'a' (97).
Piège à éviter
Ne confonds pas un chiffre-caractère et sa valeur : le caractère '5' a le code 53, pas 5. Pour passer du caractère à l'entier, on utilise int('5'), pas ord('5').
ASCII ne suffit plus dès qu'on écrit « é », « 中 » ou un emoji. Unicode résout cela en numérotant tous les caractères du monde, et UTF-8 est la façon la plus courante de stocker ces numéros en octets. Il faut bien distinguer les deux : Unicode numérote, UTF-8 encode.
- Unicode : attribue un code point unique par caractère (U+0041 = A, U+00E9 = é).
- Ampleur : plus de 140 000 caractères : alphabets, idéogrammes, symboles, emojis.
- UTF-8 : encodage à longueur variable, utilisé par plus de 98 % des sites web.
- Compatibilité : les caractères ASCII (0-127) tiennent sur 1 octet en UTF-8.
- Caractères longs : un accent prend 2 octets, un idéogramme 3, un emoji 4.
Exemple
Le mot 'café' fait 4 caractères mais 5 octets en UTF-8 : c, a, f tiennent sur 1 octet chacun, et 'é' en occupe 2. C'est pourquoi len(texte) (caractères) diffère du nombre d'octets stockés.
Piège à éviter
Unicode et UTF-8 ne sont pas synonymes : Unicode est la table de numérotation, UTF-8 l'une des manières d'écrire ces numéros en octets (à côté d'UTF-16, par exemple).
Python offre deux fonctions clés pour faire le pont entre caractère et code : ord et chr. Les chaînes y sont des objets immuables que l'on peut concaténer, mesurer et parcourir, mais jamais modifier caractère par caractère.
- ord(c) : renvoie le code Unicode d'un caractère. ord('A') vaut 65.
- chr(n) : renvoie le caractère d'un code. chr(65) vaut 'A'.
- Immuabilité : s = "hello" ; s[0] = 'H' lève une erreur — on crée une nouvelle chaîne à la place.
- Longueur et concaténation : len("Bonjour") vaut 7 ; "Bon" + "jour" donne "Bonjour".
- Ouverture de fichier : open("f.txt", encoding="utf-8") précise l'encodage utilisé.
Exemple
Pour décaler une lettre (chiffrement de César), on combine ord et chr : chr(ord('A') + 3) renvoie 'D'. Pour mettre en majuscule, on n'écrit pas dans la chaîne mais on reconstruit : s = 'H' + s[1:].
Piège à éviter
Une chaîne est immuable : s[0] = 'H' lève une TypeError. Pour « modifier » un caractère, il faut recréer une chaîne (par exemple par concaténation ou slicing).
Le bug d'encodage le plus connu donne des caractères illisibles comme « é » à la place de « é » : c'est le mojibake. Il survient quand un texte est écrit avec un encodage et lu avec un autre. Quelques réflexes simples permettent de l'éviter.
- Mojibake : caractères illisibles (é au lieu de é) dus à un mauvais décodage.
- Règle d'or : spécifier explicitement encoding="utf-8" à l'ouverture des fichiers.
- Côté Web : placer <meta charset="UTF-8"> dans le <head> du document HTML.
- Cohérence : écrire et lire un fichier avec le même encodage.
Exemple
Si un fichier écrit en UTF-8 est ouvert sans préciser l'encodage sous Windows (qui peut supposer un autre encodage), « élève » s'affiche « élève ». Forcer encoding="utf-8" à la lecture corrige l'affichage.
Piège à éviter
Le mojibake ne corrompt pas toujours le fichier : souvent le texte est intact, c'est seulement la lecture qui utilise le mauvais encodage. Vérifie l'encodage avant de conclure à une perte de données.
Quiz - Représentation des textes
10 questions
S'entraîner
Articles utiles
Questions fréquentes
Les points clés à retenir sur Représentation des textes, extraits du quiz de révision.
Quel est le code ASCII de la lettre 'A' ?
Réponse :
65
En ASCII, 'A' vaut 65. Les majuscules vont de 65 (A) à 90 (Z).
Combien de caractères la table ASCII peut-elle coder ?
Réponse :
128
ASCII utilise 7 bits, soit $2^7 = 128$ caractères (codes 0 à 127).
Quel encodage est le plus utilisé sur le Web aujourd'hui ?
Réponse :
UTF-8
UTF-8 équipe plus de 98 % des sites : compatible ASCII, il code tout Unicode sur 1 à 4 octets.
En UTF-8, combien d'octets utilise le caractère 'A' ?
Réponse :
1 octet
Les caractères ASCII (codes 0-127) tiennent sur 1 octet en UTF-8, ce qui assure la compatibilité.