Adloun

Écrire compter octets(texte) qui rend un dictionnaire donnant, pour…

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 compter_octets(texte) qui rend un dictionnaire donnant, pour chacun des encodages "latin-1" et "utf-8", le nombre d'octets — ou None si le texte n'y est pas représentable. Tester sur "NSI", "élève" et "π".

Corrigé


def compter_octets(texte):
    """Taille de texte dans chaque encodage, None si impossible.

    Precondition : aucune. C'est justement le role du try/except :
    l'echec d'un encodage est une INFORMATION, pas un accident.
    """
    tailles = {}
    for e in ("latin-1", "utf-8"):
        try:
            tailles[e] = len(texte.encode(e))
        except UnicodeEncodeError:
            tailles[e] = None
    return tailles

>>> compter_octets("NSI")
{'latin-1': 3, 'utf-8': 3}
>>> compter_octets("élève")
{'latin-1': 5, 'utf-8': 7}
>>> compter_octets("π")
{'latin-1': None, 'utf-8': 2}

Lecture des trois cas. "NSI" est de l'ASCII pur : les deux encodages coïncident, octet pour octet. "élève" passe dans les deux, mais UTF-8 coûte deux octets de plus (un par accent). "π" ne peut pas s'écrire en latin-1 : son point de code dépasse .

Ce que l'exercice montre. Latin-1 est plus compact sur du texte d'Europe occidentale, mais il ne sait écrire qu'une région du monde. UTF-8 coûte quelques octets et sait tout écrire. C'est exactement l'arbitrage historique que le programme demande de comprendre — et l'on voit pourquoi il a été tranché en faveur d'UTF-8.

Contrôle : len("π") vaut alors que sa taille UTF-8 vaut . Caractères et octets ne se comptent pas ensemble.

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.