Le code ASCII et l'encodage Unicode en Python

@joekakone

Joseph Konka @joekakone

03/03/2026 · 9 min

Comprenez l'encodage des caractères en Python : de la norme historique ASCII au standard moderne UTF-8. Maîtrisez les fonctions ord() et chr(), la manipulation d'octets (bytes) et le chiffrement de César.

Le code ASCII et l'encodage Unicode en Python#

Dans la mémoire physique d'un ordinateur, il n'existe ni lettres, ni mots, ni phrases : tout n'est qu'une suite de bits 0 et 1 regroupés en octets (8 bits). Pour représenter du texte, l'informatique associe chaque caractère à un nombre entier unique selon une table de convention appelée jeu de caractères (Character Encoding).


1. De l'ASCII historique à l'Unicode universel#

La norme ASCII (1963)#

L'ASCII (American Standard Code for Information Interchange) est la norme historique codée sur 7 bits (128 caractères numérotés de 0 à 127) : - 0 à 31 : caractères de contrôle non imprimables (retour chariot \r, saut de ligne \n, tabulation \t, sonnerie \a). - 48 à 57 : chiffres de '0' à '9'. - 65 à 90 : lettres majuscules de 'A' à 'Z'. - 97 à 122 : lettres minuscules de 'a' à 'z'.

Caractère :   'A'       'B'       '0'       'a'       ' '
Code ASCII:    65        66        48        97        32
En binaire: 01000001  01000010  00110000  01100001  00100000

Le standard universel : Unicode et UTF-8#

L'ASCII ne comportant aucun accent, ni caractères non latins (arabe, cyrillique, chinois, émojis), le consortium international a créé Unicode (plus de 149 000 caractères répertoriés).
En Python 3, le format d'encodage par défaut est UTF-8 (Unicode Transformation Format - 8-bit) : un encodage à taille variable (de 1 à 4 octets par caractère), rétrocompatible à 100% avec l'ASCII.


2. Les fonctions de conversion : ord() et chr()#

Python propose deux fonctions jumelles pour naviguer entre un caractère et son point de code numérique :

  • ord(caractere) : (Ordinal) renvoie la valeur entière du point de code Unicode/ASCII.
  • chr(code_entier) : (Character) renvoie le caractère textuel correspondant au code entier.
# 1. Obtenir le code ASCII d'un caractère
print("Code de 'A' :", ord("A"))  # 65
print("Code de 'a' :", ord("a"))  # 97
print("Code de '0' :", ord("0"))  # 48
print("Code d'un emoji 🐍 :", ord("🐍"))  # 128014

# 2. Obtenir le caractère à partir de son code
print("Caractere 65 :", chr(65))   # 'A'
print("Caractere 98 :", chr(98))   # 'b'
print("Caractere 128014 :", chr(128014))  # '🐍'

3. Les types str vs bytes : Encodage et Décodage#

En Python 3, la frontière entre texte humain et données binaires est strictement étanche :

flowchart LR
    A["Chaine de texte (str) : 'Café ☕'"] -->|encode('utf-8')| B["Flux d'octets bruts (bytes) : b'Caf\xc3\xa9...'"]
    B -->|decode('utf-8')| A
texte = "Café ☕"

# 1. Encodage en octets (bytes)
donnees_binaires = texte.encode("utf-8")
print("Octets bruts :", donnees_binaires)
print("Type         :", type(donnees_binaires))  # <class 'bytes'>
print("Longueur en octets :", len(donnees_binaires))  # 8 octets (é et ☕ occupent plusieurs octets)

# 2. Décodage en chaîne lisible
texte_restitue = donnees_binaires.decode("utf-8")
print("Texte decode :", texte_restitue)

4. Mise en pratique : Le Chiffre de César (Caesar Cipher)#

Le chiffre de César est l'un des premiers algorithmes de cryptographie historique : il consiste à décaler chaque lettre de l'alphabet d'un nombre fixe \(K\) de positions.

Grâce aux fonctions ord() et chr(), son implémentation est directe et élégante :

def chiffrer_cesar(texte_clair: str, decalage: int = 3) -> str:
    """Chiffre une chaîne selon l'algorithme de César."""
    resultat = []

    for c in texte_clair:
        if "A" <= c <= "Z":
            # Décalage circulaire pour les majuscules (modulo 26)
            base = ord("A")
            nouveau_code = (ord(c) - base + decalage) % 26 + base
            resultat.append(chr(nouveau_code))
        elif "a" <= c <= "z":
            # Décalage circulaire pour les minuscules (modulo 26)
            base = ord("a")
            nouveau_code = (ord(c) - base + decalage) % 26 + base
            resultat.append(chr(nouveau_code))
        else:
            # Ponctuation et espaces conservés inchangés
            resultat.append(c)

    return "".join(resultat)

def dechiffrer_cesar(texte_chiffre: str, decalage: int = 3) -> str:
    """Déchiffre en appliquant le décalage inverse (-decalage)."""
    return chiffrer_cesar(texte_chiffre, -decalage)

# Démonstration :
original = "Attaquez a l'aube sur AlgoJungle !"
chiffre = chiffrer_cesar(original, 5)
restaure = dechiffrer_cesar(chiffre, 5)

print("Original :", original)
print("Chiffre  :", chiffre)
print("Restaure :", restaure)

5. Défi d'application#

Écrivez un programme generateur_alphabet.py qui affiche en une seule ligne de code toutes les lettres majuscules de l'alphabet latin de 'A' à 'Z' à l'aide d'une compréhension de liste, de chr() et de range(ord('A'), ord('Z') + 1).

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue