À 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:
$ ./accent.py
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.
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_InterchangeCe 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.
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.
~$ ./accent.py
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.
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