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