Un caractère peut sembler être une simple lettre à l’écran, mais Python le représente aussi par un nombre Unicode. La fonction ord() permet d’obtenir ce point de code, y compris pour les accents, les symboles et de nombreux caractères non latins. Je détaille ici son fonctionnement, ses limites, son lien avec chr() et les erreurs fréquentes liées aux chaînes Unicode.
Les repères à retenir pour utiliser ord()
-
ord()transforme un caractère unique en nombre Unicode. - Un seul caractère doit être fourni, sinon Python déclenche une erreur.
-
ord("é")renvoie 233, car Python travaille avec Unicode et pas seulement avec ASCII. -
chr()réalise l’opération inverse en recréant un caractère à partir de son code. - Un caractère visuel peut être composé de plusieurs points de code, notamment avec certains emojis.
Comprendre le rôle de ord() en Python
La syntaxe est très courte. On passe à ord() une chaîne contenant un seul caractère, puis la fonction renvoie son point de code Unicode sous forme d’un entier.
print(ord("A"))
print(ord("a"))
print(ord("€"))
65
97
8364
La différence entre "A" et "a" n’est donc pas seulement visuelle. Leurs codes respectifs sont 65 et 97, ce qui permet par exemple de comparer des caractères ou de comprendre certains mécanismes de tri et de validation.
Je conseille de retenir une règle simple. ord() ne convertit pas un mot entier en nombre et ne calcule pas une valeur ASCII universelle. Il lit un élément de texte précis et renvoie la valeur Unicode associée.
lettre = "B"
code = ord(lettre)
print(code)
print(type(code))
Le résultat est un objet de type int. Pour vérifier le même code sous forme hexadécimale, une conversion avec hex() est pratique.
print(ord("€"))
print(hex(ord("€")))
8364
0x20ac
Utiliser ord() avec les accents et Unicode
ASCII ne couvre qu’un ensemble limité de caractères, principalement les lettres anglaises, les chiffres et quelques symboles. En Python 3, les chaînes de type str utilisent Unicode, ce qui permet à ord() de traiter directement é, ç, œ, €, Ω ou 中.
caracteres = ["é", "ç", "œ", "€", "Ω", "中"]
for caractere in caracteres:
print(caractere, ord(caractere), hex(ord(caractere)))
Cette approche est utile pour diagnostiquer un texte mal affiché, repérer un caractère inattendu ou comprendre une donnée provenant d’un fichier. Personnellement, j’utilise souvent l’affichage en hexadécimal lorsqu’un texte semble identique à l’œil mais produit pourtant un résultat différent dans un programme.
On peut aussi parcourir une chaîne et récupérer le code de chaque caractère. La fonction enumerate() conserve en plus la position dans le texte.
mot = "été"
for position, caractere in enumerate(mot):
print(position, caractere, ord(caractere))
0 é 233
1 t 116
2 é 233
Il faut toutefois distinguer le caractère affiché de sa représentation interne. Le symbole é peut être écrit comme un caractère précomposé ou comme la lettre e suivie d’un accent combiné. Visuellement, le résultat est similaire, mais les points de code ne sont pas les mêmes.
print(len("é"))
print(len("e\u0301"))
1
2

Ne pas confondre caractère, octet et encodage
Une source fréquente de confusion vient de la différence entre une chaîne Unicode et une suite d’octets. Une chaîne str représente du texte, tandis qu’un objet bytes contient des valeurs binaires utilisées lors de la lecture ou de l’écriture de fichiers et de communications réseau.
| Élément | Exemple | Signification |
|---|---|---|
| Chaîne Unicode | "é" |
Un caractère textuel dont le point de code est U+00E9 |
| Octets UTF-8 | b"\xc3\xa9" |
Deux octets représentant é en UTF-8 |
| Octet isolé | b"\xc3" |
Une valeur binaire, pas le caractère é complet |
Avec une chaîne Unicode, ord("é") renvoie 233. Après encodage en UTF-8, le même caractère devient deux octets, 195 et 169. Ces nombres décrivent l’encodage binaire, pas directement le point de code Unicode du caractère.
texte = "é"
octets = texte.encode("utf-8")
print(ord(texte))
print(octets)
print(list(octets))
233
b'\xc3\xa9'
[195, 169]
Dans la pratique, je vérifie toujours le type de la donnée avant d’utiliser ord(). Si elle vient d’un fichier ou d’une requête réseau, il faut souvent la décoder d’abord.
donnees = b"\xc3\xa9"
texte = donnees.decode("utf-8")
print(texte)
print(ord(texte))
Cette étape évite une erreur classique. Encoder transforme du texte en octets, tandis que décoder transforme des octets en texte. Mélanger ces deux opérations peut produire des caractères illisibles ou des exceptions de décodage.
Revenir du code Unicode au caractère avec chr()
chr() est le complément naturel de ord(). Elle reçoit un entier et renvoie le caractère correspondant, ce qui permet de reconstruire une chaîne ou de vérifier qu’une conversion est correcte.
code = ord("€")
caractere = chr(code)
print(code)
print(caractere)
8364
€
La relation peut se résumer ainsi. ord(caractere) produit un nombre, tandis que chr(nombre) produit un caractère.
for caractere in "Python":
code = ord(caractere)
print(caractere, code, chr(code))
La valeur fournie à chr() doit se trouver dans l’intervalle Unicode valide, de 0 à 0x10FFFF. Une valeur négative ou trop élevée déclenche une ValueError.
print(chr(65))
print(chr(0x1F600))
A
😀
Cette conversion est utile pour générer des symboles, manipuler des alphabets ou tester des caractères dans un script. Elle ne remplace cependant pas une vraie gestion de la langue. Construire du texte uniquement à partir de nombres devient vite difficile à maintenir.
Les erreurs fréquentes avec ord()
Passer une chaîne trop longue
L’erreur la plus courante apparaît lorsqu’on fournit plusieurs caractères. Python ne sait pas quel élément convertir et signale que la chaîne ne contient pas un caractère unique.
ord("Python")
TypeError: ord() expected a character, but string of length 6 found
Pour analyser chaque caractère, il faut parcourir la chaîne ou sélectionner une position précise.
texte = "Python"
for caractere in texte:
print(ord(caractere))
print(ord(texte[0]))
Passer une chaîne vide
Une chaîne vide ne contient aucun caractère, donc elle provoque également une erreur. Ce cas arrive souvent lorsqu’une valeur provient d’une saisie utilisateur ou d’un fichier vide.
valeur = ""
if valeur:
print(ord(valeur[0]))
else:
print("Aucun caractère à analyser")
Ce contrôle simple évite de traiter une donnée inexistante. Dans un programme plus robuste, je vérifie aussi que la valeur reçue est bien une chaîne et non None ou un nombre.
Lire aussi : Python str.replace - Maîtrisez le remplacement de sous-chaînes
Oublier les caractères composés
Un emoji ou un symbole visuel peut être formé de plusieurs points de code. Le drapeau français "🇫🇷", par exemple, combine deux indicateurs régionaux. Il ne peut donc pas être envoyé directement à ord().
drapeau = "🇫🇷"
for caractere in drapeau:
print(hex(ord(caractere)))
Le même phénomène concerne les accents combinés et les séquences avec jointure zéro, fréquentes dans les emojis. Quand l’objectif est d’analyser ce que l’utilisateur perçoit comme un symbole unique, ord() seul ne suffit pas toujours. Il faut alors raisonner en grappes de graphèmes, c’est-à-dire en unités visuelles complètes.
Des usages pratiques pour inspecter et valider du texte
La fonction peut servir à vérifier qu’un caractère appartient à une plage donnée. Les lettres majuscules latines correspondent aux codes 65 à 90, mais je préfère généralement les méthodes comme isupper() lorsqu’il s’agit de gérer correctement plusieurs alphabets.
caractere = "G"
if 65 <= ord(caractere) <= 90:
print("Majuscule latine")
else:
print("Autre caractère")
Pour diagnostiquer des espaces invisibles, l’affichage du code Unicode est particulièrement efficace. Un espace classique, une espace insécable et une tabulation peuvent se ressembler dans un texte, tout en ayant des valeurs différentes.
texte = "A\u00a0B\tC"
for caractere in texte:
print(repr(caractere), hex(ord(caractere)))
Je recommande aussi d’associer ord() au module unicodedata lorsque l’identification doit être lisible par un humain. Le nom Unicode explique mieux un caractère que son seul nombre.
import unicodedata
caractere = "€"
print(hex(ord(caractere)))
print(unicodedata.name(caractere))
0x20ac
EURO SIGN
Enfin, pour comparer des caractères ou contrôler une entrée, il vaut mieux ne pas utiliser aveuglément leur code numérique. Les méthodes comme isalpha(), isdigit() et casefold() prennent davantage en compte les règles Unicode. ord() est excellent pour inspecter et comprendre, mais ce n’est pas toujours le meilleur outil pour appliquer une règle linguistique.
Ce que révèle réellement un code Unicode
La fonction ord() donne une réponse directe à une question précise. Elle indique le point de code Unicode associé à un caractère unique, qu’il s’agisse d’une lettre française, d’un symbole monétaire ou d’un caractère international.
Pour éviter les pièges, je retiens trois réflexes. Je vérifie que la chaîne contient bien un seul élément, je distingue toujours texte et octets, puis j’utilise chr() pour tester le chemin inverse. Cette méthode suffit dans la majorité des scripts Python et rend les problèmes d’encodage beaucoup plus faciles à localiser.