Écrire codes(texte) qui rend la liste des points de code des…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 2 — Flottants, booléens et textes · Manipuler du texte caractère par caractère
Énoncé
Écrire codes(texte) qui rend la liste des points de code des caractères, et depuis_codes(liste) qui fait l'inverse. Vérifier l'aller-retour sur "π ç", puis comparer la longueur de la liste obtenue au nombre d'octets du texte en UTF-8.
Corrigé
def codes(texte):
"""Liste des points de code des caracteres de texte."""
return [ord(c) for c in texte]
def depuis_codes(liste):
"""Texte reconstruit a partir de points de code.
Precondition : chaque entier est un point de code valide, donc
compris entre 0 et 0x10FFFF ; sinon chr leve une ValueError.
"""
return "".join(chr(n) for n in liste)
>>> codes("NSI")
[78, 83, 73]
>>> t = "π ç"
>>> codes(t)
[960, 32, 231]
>>> depuis_codes(codes(t)) == t
True
>>> len(t), len(t.encode("utf-8"))
(3, 5)
Les deux fonctions sont inverses l'une de l'autre, parce que ord et chr le sont : elles ne font que lire, dans les deux sens, la table du répertoire Unicode. Aucun encodage n'intervient ici — on n'a manipulé que des numéros, pas des octets.
La comparaison finale est tout le chapitre en une ligne. La liste des points de code compte 3 éléments ; le texte occupe 5 octets en UTF-8 (deux pour , un pour l'espace, deux pour le ç). Trois notions distinctes se cachent derrière le mot « longueur » : le nombre de caractères, le nombre de points de code, et le nombre d'octets. Les deux premières coïncident presque toujours, la troisième dépend de l'encodage.
Erreur attendue : écrire depuis_codes(t.encode("utf-8")). On passerait alors les octets à chr, et l'octet 0xCF rendrait la lettre « Ï » — le mojibake, reconstruit à la main.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.