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.

  1. À l’aide de la table ASCII du cours, recopier et compléter le tableau. La première ligne est donnée.
CaractèreCode décimalCode hexadécimalCode binaire sur 8 bits
N784E01001110
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.

  1. É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.

  2. Vérifier avec Python : ord("S") donne le code décimal de S, hex(ord("S")) son code hexadécimal et bin(ord("S")) son code binaire.

    Indice

    hex et bin écrivent 0x ou 0b devant le code et n’affichent pas les zéros de tête : 0b1010011 correspond à 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èreCode décimalCode hexadécimalCode 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

  1. 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.

  2. Décoder le message ASCII binaire suivant : 01000010 01110010 01100001 01110110 01101111

    Indice

    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.

  3. 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

  1. 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 ?

  2. 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, puis chr(...) redonne le caractère.

  3. En ASCII, le caractère '0' a le code 48. Écrire une fonction chiffre_vers_entier(c) qui convertit un caractère chiffre ('0' à '9') en l’entier correspondant, sans utiliser int().

    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

  1. En Python, comparer len('café') et len('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 de café occupe plus d’un octet ?

  2. 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.

  3. 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.

  1. 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 é ?

  2. 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, et octets.decode('iso-8859-1') les relit comme du Latin-1 : comparer le résultat affiché avec le texte de départ.

  3. 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.