Encodage python

Encodage la bête noire des développeurs

Un jour ou l'autre vous tomberez sur une erreur d'encodage et vous y passerez des heures pour comprendre d'où vient le problème

Exemple de problème d'encodage:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 49059: ordinal not in range(128)

Les problèmes d'encoding viennent du fait que l'informatique a plus ou moins été crée par des anglophones (ça commence par Alan Turing) et que dans cette langue il n'y pas d'accents alors que la langue française en regorge à foison! Et d'ailleurs d'autres langues comme l'espagnol intègre des accents que nous ne possédons pas. Les encodages utilisés par nos amis anglophones ne sont donc pas compatibles avec les notres et cela créer des erreurs.

UTF-8 la solution miracle

UTF-8 est un encodage universel qui a pour objectif de rénuir les caractères utilisés par toutes les langues. Il n'y a donc en théorie plus de problèmes de communication si tous les programmes sont encodés avec de l'UTF8. Idéalement il faudrait que tout le monde intègre l'UTF8 par défaut, change l'ancien encodage par de l'UTF8 et non l'inverse.

Par défaut dans python 2.7 l'encoding est ASCII, il est donc nécessaire d'indiquer l'encodage UTF8 à chaque fois

Comment intégrer cet encodage dans nos programmes?

Pour cela il vous faudra indiquer dans l'entête l'encodage UTF-8 les lignes suivantes:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

Il existe cette autre syntaxe pour indiquer un encodage:

#!/usr/bin/env python
# coding: utf-8

L'encoding de votre fichier

Alors évidemment il faut de l'UTF8 partout et tout le temps: y compris dans l'encodage de votre fichier lors de son enregistrement. En effet il est essentiel d'indiquer l'encodage dans l'entête de votre fichier mais il est encore plus import d'enregistrer votre fichier en UTF8. Et cette action c'est votre éditeur de texte qui s'en charge.

Par exemple avec notre éditeur préféré -sublime text- vous pouvez choisir l'encodage dans File > Save with encoding. Evidemment par défaut les fichiers sont enregistrés en UTF8 mais assurez-vous que c'est bien le cas en cas de bug.

String et Unicode

Il existe deux types de chaînes de caractères en python: les types string et les types unicode.

name = 'engel'  # str
name = u'engel' # unicode

Il vous faudra toujours utiliser le version unicode.

La bonne nouvelle c'est que dans python 3 cette syntaxe va disparaitre vu que par défaut tout sera en unicode. Il est même possible d'intégrer cette fonctionnalité dans python 2.7 en important le module suivant:

from __future__ import unicode_literals

Unidecode

Parfois il n'y a pas de solution autre que de supprimer purement et simplement les accents. Vous pouvez utiliser le module unidecode:

pip install unidecode

Et dans votre fichier:

from unidecode import unidecode

print unidecode(u"éllèç")

Résultat:

ellec