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