PRATIQUE OUTILS 
Le support Unicode dans Python
 
Utilisation pratique du jeu de caractères universel au sein du langage dynamique. (17/03/2006)
  Forum

Réagissez dans les forums de JDN Développeurs

Le support Unicode est aujourd'hui une nécessité : avec l'internationalisation de la création logicielle (notamment par le biais de l'Open Source), un outil ne peut plus se permettre de ne reconnaître qu'un jeu de caractères (au mieux, celui de sa région linguistique, au pire, ASCII).

Sorti de l'ASCII, des centaines de codages existent, chacun répondant au besoin d'une région précise. Unicode remplace et étend l'ensemble de ces codages en un seul super-codage, exhaustif et extensible (lire notre article du 03/10/05). UTF-8 est une approche d'Unicode, qui grâce à une technique de codage de caractère à longueur variable (de 1 à 4 octets selon le besoin du caractère) peut fonctionner avec les logiciels conçus pour ne comprendre que les caractères à un octet.

Le support Unicode est apparu tardivement au sein de Python, qui à l'origine en reconnaissait que les codes locaux, avec le type str. Aujourd'hui, Python dispose également d'un type unicode, et des méthodes pour passer de l'un à l'autre. Par défaut, une chaîne utilise la locale du fichier traité, mais le support Unicode peut être fait de manière explicite, en ajoute un u en début de chaîne.

chaineStandard = "Je ne sais pas quoi dire"
chaineUnicode = u"Je ne sais pas quoi \xe9crire non plus"


Pour définir la locale du fichier traité, il faudra placer à la première ligne (ou la seconde si la directive #!/usr/bin/python est en premier) des fichiers source d'un projet la directive suivante :

# -*- coding: utf8 -*-

Les encodages reconnus sont nombreux : ascii et latin1 bien sûr, mais également windows-1552, shift_jis, korean, …

Dans le cas où on utilise des fichiers dont l'encodage n'est pas défini, les chaînes sont stockées sans information spécifique. Puis, lors de la lecture de la chaîne, Python utilise donc l'encodage par défaut, ASCII. Pour peu que la chaîne contienne des caractères étendus, une erreur sera affichée. Mieux donc toujours utiliser le préfixe u.

Il reste cependant possible de changer d'encodage directement, avec les méthodes decode() et encode(), respectivement des objets str et unicode.

s = "Le lapin a mangé ma main!"
s2 = s.decode("latin1", "replace")
t = u"Méchant lapin!"
t2 = t.encode("latin1", "replace")


unicode.encode() renvoie une chaîne de type str, codée sur 8 bits dans le codage spécifié. str.decode() prend une chaîne Unicode et renvoie une chaîne de type str dans le codage adéquat.
L'argument replace précise les données non reconnues sont remplacées par un caractère générique, généralement un point d'interrogation. Cet argument peut également prendre la forme strict (provoque une erreur en cas de mauvais caractère), ou ignore (laisse le caractère tel quel).

La manière définitive de faire fonctionner votre Python avec UTF-8 est de créer un nouveau module dans le dossier /Lib/site-packages, appelé sitecustomize.py. A son lancement, Python cherchera à l'importer, et donc de lancer tout code s'y trouvant. Il vous suffit d'ajouter la ligne suivante pour implémenter Unicode dans vos projets :

import sys
sys.setdefaultencoding("utf-8")
 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page