16 - Représentation des textes
Les exercices se font dans Thonny, dans le fichier 16_representation_des_textes.py.
Cours associé : 06 - Textes .
Exercice 1 : QCM – vérification des prérequis
Pour chaque question, une seule réponse est correcte.
1. En ASCII, combien de caractères différents peut-on coder ?
- A. 26 (les lettres de l’alphabet)
- B. 128
- C. 256
- D. Plus d’un million
Correction publiée après la séance.
2. En ASCII, le code de 'A' est 65 et celui de 'a' est 97. Quel est le code de 'C' ?
- A. 66
- B. 67
- C. 99
- D. 68
Correction publiée après la séance.
3. Pourquoi a-t-on créé Unicode ?
- A. Pour remplacer le binaire par l’hexadécimal
- B. Pour pouvoir représenter les caractères de toutes les langues du monde
- C. Pour compresser les fichiers texte
- D. Pour accélérer l’affichage des pages Web
Correction publiée après la séance.
4. En UTF-8, un caractère ASCII standard (comme 'A') est codé sur :
- A. 1 octet
- B. 2 octets
- C. 3 octets
- D. 4 octets
Correction publiée après la séance.
Exercice 2 : encodage d’un mot en ASCII
On veut encoder le mot NSI en ASCII.
- À l’aide de la table ASCII du cours, recopier et compléter le tableau. La première ligne est donnée.
| Caractère | Code décimal | Code hexadécimal | Code binaire sur 8 bits |
|---|---|---|---|
N | 78 | 4E | 01001110 |
S | |||
I |
Indice
La table ASCII du cours donne le code décimal. Pour l’hexadécimal, diviser par 16 : le quotient et le reste donnent les deux chiffres. Pour le binaire, écrire chaque chiffre hexadécimal sur quatre bits, comme 4E qui donne 0100 1110.
Écrire la suite des trois octets qui code le mot « NSI ».
Indice
Mettre bout à bout les codes binaires sur 8 bits des trois lettres, dans l’ordre du mot, en les séparant par une espace.
Vérifier avec Python :
ord("S")donne le code décimal deS,hex(ord("S"))son code hexadécimal etbin(ord("S"))son code binaire.Indice
hexetbinécrivent0xou0bdevant le code et n’affichent pas les zéros de tête :0b1010011correspond à01010011.
Correction publiée après la séance.
Exercice 3 : encodage guidé
3.1 Encoder en ASCII
Compléter le tableau pour le mot Bye :
| Caractère | Code décimal | Code hexadécimal | Code binaire (8 bits) |
|---|---|---|---|
'B' | … | … | … |
'y' | … | … | … |
'e' | … | … | … |
Indication : 'A' = 65, 'a' = 97, les lettres se suivent dans l’ordre alphabétique.
Indice
Le rang de la lettre dans l’alphabet donne son code : 'B' est la deuxième lettre, son code est donc 65 + 1. Pour l’hexadécimal et le binaire, procéder comme à l’exercice 2.
Correction publiée après la séance.
3.2 Décoder un message ASCII
Décoder le message suivant (codes ASCII décimaux) : 72 101 108 108 111.
Indication : procéder caractère par caractère en utilisant la table ASCII.
Indice
Soustraire 65 (majuscules) ou 97 (minuscules) donne le rang de la lettre dans l’alphabet, en partant de 0 : par exemple, 70 − 65 = 5, c’est la sixième lettre, F. En Python, chr(70) permet de vérifier.
Correction publiée après la séance.
Exercice 4 : encodage et décodage autonomes
Encoder en ASCII binaire (huit bits par caractère) la phrase :
Le but.Indice
Il y a six caractères à coder, l’espace compris, dont le code ASCII est 32. Pour chacun, trouver le code décimal, puis l’écrire en binaire sur huit bits en complétant à gauche par des 0.
Décoder le message ASCII binaire suivant :
01000010 01110010 01100001 01110110 01101111Indice
Convertir chaque octet en décimal en additionnant les poids des bits à 1 (128, 64, 32, 16, 8, 4, 2, 1), puis retrouver la lettre dans la table ASCII, ou avec
chr(...)en Python.En Python, écrire une fonction
encoder(texte)qui prend une chaîne et renvoie la liste des codes ASCII (entiers).Indice
Partir d’une liste vide, parcourir la chaîne caractère par caractère et ajouter
ord(c)à la liste.Code à copier puis compléter
def encoder(texte): codes = [] for c in texte: codes.append(...) return codes
Correction publiée après la séance.
Exercice 5 : ASCII et propriétés numériques
En ASCII, quel est l’écart entre le code d’une lettre majuscule et le code de la même lettre minuscule ? (Tester avec quelques lettres.)
Indice
Afficher
ord('a') - ord('A'), puis faire de même avec d’autres lettres : l’écart change-t-il ?En déduire une fonction Python
majuscule(c)qui transforme une lettre minuscule en majuscule sans utiliser la méthode.upper().Indice
Passer par les codes :
ord(c)donne le code de la minuscule, on lui retire l’écart trouvé à la question 1, puischr(...)redonne le caractère.En ASCII, le caractère
'0'a le code 48. Écrire une fonctionchiffre_vers_entier(c)qui convertit un caractère chiffre ('0'à'9') en l’entier correspondant, sans utiliserint().Indice
Les chiffres
'0'à'9'ont des codes consécutifs, de 48 à 57 : de combien le code de'7'dépasse-t-il celui de'0'?
Correction publiée après la séance.
Exercice 6 : UTF-8 et caractères accentués
En Python, comparer
len('café')etlen('café'.encode('utf-8')). Expliquer la différence.Indice
len('café')compte des caractères, alors que.encode('utf-8')produit des octets : quel caractère decaféoccupe plus d’un octet ?Le caractère
'é'a le point de code Unicode U+00E9 ($= 233_{10}$). Combien d’octets UTF-8 sont nécessaires pour le coder ? (Rappel : 0 à 127 → un octet ; 128 à 2047 → deux octets.)Indice
Situer 233 dans les intervalles du rappel.
L’emoji 🎓 a le point de code U+1F393. Combien d’octets UTF-8 sont nécessaires ?
Indice
Comparer U+1F393 aux intervalles du tableau UTF-8 du cours : de U+0800 à U+FFFF, trois octets ; de U+10000 à U+10FFFF, quatre octets. Le programme ci-dessous permet de vérifier.
print(len('café'))
print(len('café'.encode('utf-8')))
print('🎓'.encode('utf-8'))
Correction publiée après la séance.
Exercice 7 : synthèse – message secret multilangue
Un site Web affiche des caractères incorrects (des é au lieu de é). Ce problème s’appelle un mojibake.
Expliquer pourquoi ce problème se produit (indice : le fichier est encodé dans un format mais lu dans un autre).
Indice
En UTF-8,
éoccupe deux octets. Un logiciel qui lit le fichier en Latin-1 prend chaque octet pour un caractère : combien de caractères affiche-t-il à la place deé?En Python, simuler le problème : exécuter le programme suivant, qui encode la chaîne
'été'en UTF-8, puis la décode en Latin-1 ('iso-8859-1'). Qu’obtient-on ?texte = 'été' octets = texte.encode('utf-8') print(octets.decode('iso-8859-1'))Indice
texte.encode('utf-8')donne les octets du texte, etoctets.decode('iso-8859-1')les relit comme du Latin-1 : comparer le résultat affiché avec le texte de départ.Comment corriger ce problème sur un site Web ? Quelle balise HTML faut-il vérifier ?
Indice
Le navigateur doit savoir dans quel encodage le fichier a été écrit. Quelle balise de la section
<head>le lui indique ?
Correction publiée après la séance.