Outils pour utilisateurs

Outils du site


encodage

Ceci est une ancienne révision du document !


Petites contributions à la compréhension des encodages

Essais réalisés avec Python 2.6

Objectif

Depuis le temps que je me cogne (comme tant d'autres) contre les subtilités de l'encodage des chaines de caractères, j'ai investi un peu de temps pour y voir plus clair.

L'objectif de cette page est d'identifier les principes de traitement à utiliser pour intégrer, manipuler, afficher et enregistrer des chaines de caractères comportant, par exemple, des caractères accentués.

A noter que des erreurs de traitement sur ce sujet peuvent aller jusqu'à planter un programme!

Les polices de caractères

L'ordinateur, qui est très bête, ne sait pas ce qu'est un caractère comme “A”. Il ne sait que contenir des codes numériques comme 65 (ou 0x41 en hexa). Le fait de rattacher le nombre 65 à la lettre “A” n'est qu'une convention.

Ainsi, au départ de l'informatique, il a été établi une liste de correspondance très simple, qui ne comportait que:

  • des caractères latins non accentués: a, b, c,…, A, B, C, …
  • des chiffres: 0, 1, …, 9
  • des caractères de ponctuation: !, ?, :, espace, …
  • des caractères de contrôle non imprimables: tabulation, retour chariot, effacement, échappement, …

Cette liste de correspondance, associant un nombre au dessin d'un caractère, ne nécessitait seulement que des nombres de 0 à 127, soit des octets (8 bits) sans le dernier bit de gauche. On parle de codage “ASCII” (http://fr.wikipedia.org/wiki/ASCII).

Elle a été complétée plus tard pour contenir des caractères supplémentaires comme les caractères accentués “é”, “è”, “ô”, …, ainsi que d'autres caractères de contrôle… Mais là, il a fallu étendre les nombres pour utiliser la partie 128 à 255 des octets.

En fait, il y a actuellement de nombreuses normes pour représenter les caractères particuliers des pays, tout en restant à l'intérieur des octets (0 à 255). Les principaux pour nous pays de langue française sont:

L'avantage est que les premiers caractères de 0 à 127 sont sensiblement les mêmes que dans le codage ASCII. Pour les caractères supplémentaires, il y a cependant quelques différences dont il faut se méfier. Par exemple entre cp1252/ANSI et iso-8859-1 :http://www.alanwood.net/demos/charsetdiffs.html.

Pour les autres pays ayant des caractères non latins, il existe d'autres codages de caractères comme l'iso-8859-5 pour l'alphabet cyrillique, l'iso-8859-7 pour l'alphabet grec moderne, etc…

Mais maintenant, comment faire pour que les même programmes puissent, sans changer de codage de caractères, être utilisés en Grèce, en Inde, en Russie, en Chine, etc… Ceci d'autant plus qu'avec Internet, les échanges sont devenus quotidiens, et rien ne doit vous empêcher de converser par mail avec des chinois ou des russes. La multiplicité des caractères exclut qu'on reste à l'intérieur des octets (0 à 255): alors, comment on fait? On invente l'UNICODE! Voir http://fr.wikipedia.org/wiki/Unicode.

Il y a en fait plusieurs types d'unicode: UCS-2, UTF-8, UTF-16, UTF-32, …

En simplifiant, pour nous, français utilisant Python:

  • UCS-2 est l'unicode utilisé en interne par Python. Il est proche de l'UTF-16.
  • UTF-8 utilise de 1 à 4 octets par caractère. L'avantage est que les caractères codés en 1 seul octet de 0 à 127 sont sensiblement les mêmes que dans l'ASCII.
  • UTF-16 utilise 2 octets par caractères (plus si nécessaire pour des cas spéciaux et rares)

Généralités sur l'encodage des caractères dans Python

Entrée/Traitement/sortie de chaines de caractères

Entrée/sortie de chaines de caractères

Chaines de caractères intégrées dans le code source

Entrées au clavier de chaines de caractères

Entrée par lecture de données sur disque

Traitement interne de chaines de caractères

encodage.1250489750.txt.gz · Dernière modification: 2009/08/17 08:15 de tyrtamos

Outils de la page