Codage des caractères — ASCII

Denis Dréano
INFO2-02

Codage des caractères — ASCII

Objectifs cantonaux : O2.3, O2.4.

Cours complet sur la plateforme Runestone de Cédric Donner : Codage ASCII.

Un ordinateur ne stocke que des nombres (donc, en dernier ressort, des bits). Pour représenter du texte, il faut donc une convention qui associe un nombre à chaque lettre, chiffre ou symbole. La plus ancienne et la plus connue de ces conventions est le code ASCII (American Standard Code for Information Interchange).

La table ASCII

▷ Définition — Table ASCII

La table ASCII associe un nombre entier (de 0 à 127) à chaque lettre (majuscule et minuscule), chiffre, signe de ponctuation et caractère de contrôle (espace, retour à la ligne, …). Elle a été codée sur 7 bits, ce qui donne \(2^7 = 128\) caractères possibles.

! Majuscules ≠ minuscules

Dans la table ASCII, une majuscule et sa minuscule correspondante n’ont pas le même code : il y a un décalage constant de 32 entre les deux (par exemple A vaut 65 et a vaut 97).

→ Exemple 1 — le caractère A

Le caractère A vaut \(65\) en décimal, \(01000001_2\) en binaire et \(41_{16}\) (noté 0x41) en hexadécimal. On préfère souvent la notation hexadécimale : plus compacte, elle correspond exactement à 2 chiffres pour un octet (8 bits).

ASCII et Python

◈ Syntaxe — ord() et chr()

ord(c)      # renvoie le code (décimal) du caractère c
chr(code)   # renvoie le caractère associé au code
→ Exemple 2 — code d’un caractère
c = 'A'
print("Décimal :", ord(c))          # 65
print("Binaire :", bin(ord(c)))     # 0b1000001
print("Hexadécimal :", hex(ord(c))) # 0x41
→ Exemple 3 — passer une minuscule en majuscule
def upper(char):
    code = ord(char)
    if ord('a') <= code <= ord('z'):
        char = chr(code - 32)
    print(char)

upper('c')   # affiche C
upper('$')   # affiche $ (inchangé)

L’écart constant de 32 entre majuscules et minuscules permet ce genre de calcul directement sur les codes.

Exercice 1 — coder un message

En utilisant la table ASCII (fournie en classe), codez en binaire (paquets de 8 bits) puis en hexadécimal le message Salut!, sans outil de conversion automatique.

Exercice 2 — décoder un message

Un message a été intercepté sous cette forme hexadécimale :

0x43 0x48 0x31 0x32 0x20 0x30 0x35 0x36 0x32

! Indice

Dans la table ASCII, tous les chiffres X sont codés 0x3X. Par exemple 0x34 code le chiffre 4.

Décodez ce message caractère par caractère.

Exercice 3 — type de caractère

Écrivez une fonction char_type(char) qui, à partir du code ASCII d’un seul caractère char, affiche :

  • MAJUSCULE s’il s’agit d’une lettre majuscule,
  • MINUSCULE s’il s’agit d’une lettre minuscule,
  • CHIFFRE s’il s’agit d’un chiffre,
  • ESPACE s’il s’agit d’une espace,
  • AUTRE sinon.

◈ Exemples attendus

>>> char_type('A')
MAJUSCULE
>>> char_type('z')
MINUSCULE
>>> char_type('7')
CHIFFRE
>>> char_type(' ')
ESPACE
>>> char_type('$')
AUTRE

! Combien de bits pour 128 caractères ?

Sur 7 bits, on code \(2^7 = 128\) caractères — exactement le nombre de caractères de la table ASCII de base. C’est pour cela qu’on parle d’ASCII « sur 7 bits », même si chaque caractère occupe en réalité un octet entier (8 bits) en mémoire.

Devoir donné par Cédric

Terminer les exercices de codage/décodage ASCII (message codé, message décodé, fonction char_type).