Adloun

É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.