Eléments de programmation en Python

Les caractères accentués: le problème de la tour de Babel

La tour de Babel: Pieter Bruegel l'AncienÀ une époque très ancienne, tous les humains parlaient la même langue. Ils entreprirent la construction d'une tour qui devait leur permettre d'atteindre leciel: la tour de Babel.

Jugeant leur entreprise trop orgueilleuse, Dieu décida de multiplier les langues utilisées par les humains, afin qu'ils ne se comprennent plus. Ainsi échoua la construction de la tour.

L'informatique d'aujourd'hui doit pouvoir tenir compte de la multiplicité des langages.

Ouais, ouais. Vous êtes gentil avec votre affaire de tour de Babel, mais pour moi, le seul problème de langage que j'ai avec Python, c'est quand il m'envoie des injures parce que j'utilise des caractères accentués.

Précisément, c'est la question que nous abordons. Et vous verrez qu'il y a bien un rapport avec la Tour de Babel.

Si tu n'as jamais observé de problème lié aux caractères accentués, tente l'expérience suivante:

  • Dans un éditeur de textes, reproduis le texte suivant:
#! /usr/bin/python
print "évitons les problèmes"
  • Enregistre le document sous le nom accent.py
  • Lance le programme correspondant

$ ./accent.py

  • Observe le résultat:
toto@info20:~$ ./accent.py
File "accent.py", line 2
SyntaxError: Non-ASCII character '\xc3' in file accent.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Et bien voilà. Vous trouvez agréable ce genre de discours?

Il faut convenir que ce n'est pas un langage de gentleman. Mais il y a une explication. Et nous devrons retourner à la Tour de Babel.

Le codage des caractères: version ASCII

La mémoire de l'ordinateur ne peut contenir que des 0 et des 1, des bits.

Pour que la machine soit, malgré tout, capable de traiter également des caractères alphabétiques, des signes de ponctuation,... on utilise des groupes de 8 bits auxquels on attribue une signification arbitraire.

Par exemple, dans la norme ASCII (American Standard Code for Information Interchange) inventée dans les années 1980, on a décidé d'attribuer un code numérique à chaque caractère de l'alphabet et à quelques signes supplémentaires.

http://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange

Ce codage utilise en fait seulement 7 bits et permet de coder 127 caractères dont 96 sont imprimables. 

Les caractères accentués existant dans de nombreuses langues ne sont pas pris en compte.

Ah, je comprends pourquoi il m'insulte avec SyntaxError: Non-ASCII character

Effectivement, les caractères accentués ne figurent pas dans cette norme. Voyons la solution.

Le codage des caractères: version ISO

Un organisme international (l'ISO: International Organization for Standardization) a établi une norme permettant de coder les caractères accentués dans différentes langues. C'est la norme ISO-8859 qui utilise les 8 bits.

La norme ASCII est toujours en vigueur, mais on peut employer les codes non utilisés entre 128 et 255 pour les caractères accentués.

Pour des raisons pratiques que nous n'envisagerons pas ici, la norme ISO n'utilise que les codes compris entre 161 et 255 pour des caractères imprimables: soit 95 codes.

Exemples: "à" -> code 224 ; "é" -> code 233; ...

95 codes pour les caractères accentués "éèâîôù..."? Il n'en faut pas tant. A l'aise, donc.

Les choses ne sont pas si simples. D'autres langues utilisent d'autres caractères accentués. Et l'on a même prévu de traiter la langue thai qui contient un assez grand nombre de caractères particuliers.

C'est la malédiction de Babel?

Il y a de cela, parce que cela complique les choses.

Il existe des variantes dans la norme ISO-8859.

La norme ISO-8859-1 correspond le mieux à l'alphabet accentué des langues européennes.

D'autres normes (ISO-8859-2, ISO-8859-3, ISO-8859-4, ....) utilisent les mêmes codes pour représenter éventuellement d'autres caractères.

Pour les curieux, voir les différentes normes.

  • Ouvre ou crée le fichier accent.py décrit plus haut sur cette page.
  • Sur la deuxième ligne, ajoute la mention de l'encodage utilisé
#! usr/bin/python
# -*- coding: ISO-8859-1 -*-
print "évitons les problèmes"
  • Relance la commande

~$ ./accent.py

  • Observe le résultat.
toto@info20:~$ ./accent.py
évitons les problèmes

Ah, effectivement, plus de problème maintenant. Mais c'est dommage que Python soit si compliqué. Franchement, je suis déçu.

Ce n'est pas Python qui est compliqué: ce sont les langages humains qui sont complexes.

Tous ces problèmes d'encodage sont également présents dans les pages web, par exemple.
  • Pour changer le type d'encodage de la page en cours, dans Firefox, procède comme indiqué dans l'illustration ci-dessous:
    > Affichage > Encodage des caractères > Plus d'encodages > Européen de l'Est > Cyrilliique (ISO-8859-5)
Changer l'encodage
  • Observe le contenu de la page
  • Essaie éventuellement d'autres encodages.

Le type d'encodage d'une page web doit toujours être précisé dans le code de l'entête de la page.

De cette manière, le navigateur affichera la page avec l'encodage correct pour les caractères accentués en français, par exemple.

Quand tes programmes fonctionnent, passe à la page suivante. Vers la page suivante Page suivante


Dernière modification 18/08/2016 Test dans /info ...