Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

Considérons le programme menu.py, chargé d'afficher le menu du jour:

#!/usr/bin/python
 
from datetime import date
 
menu = [
    "Les restes de dimanche",
    "Mardi, c'est raviolis",
    "Mercredi, purée",
    "Les coquillettes du jeudi",
    "Vendredi poisson",
    "Samedi soupe",
    "Dimanche surprise!"
]
 
print "Votre menu du jour:"
print menu[date.today().weekday()]

Un programme aussi simple ne peut pas poser de problème? Et pourtant, si on tente de l'exécuter, surprise:

sh$  ./menu.py 
  File "./menu.py", line 8
SyntaxError: Non-ASCII character '\xc3' in file ./menu.py on line 8, but no  
encoding declared; see http://www.python.org/peps/pep-0263.html for details

Quel est donc le problème sur la ligne 8? Que se passe-t-il donc le mercredi? Python n'aimerait-il pas la purée? C'est un peu ça: En fait, sans indice particulier, Python suppose que le fichier utilise l'encodage US-ASCII ... ce qui n'est visiblement pas le cas, puisque si l'US ASCII ne supporte pas les lettres accentuées – alors que notre fichier en contient bel et bien!

Bref, il faut donc préciser à Python l'encodage utilisé. Plusieurs moyens – mais tous reposent sur l'idée d'ajouter un commentaire pour préciser l'encodage sur la première ou la seconde ligne du fichier.

Pourquoi la première ou la seconde ligne?

Et bien pour permettre – comme je le fais ici – d'éventuellement préciser l'exécutable chargé d'interpréter le script sur la première ligne.

Voyez à ce sujet l'article Rendre un script exécutable.

Si vous utilisez l'éditeur emacs ou vim, vous pouvez faire d'une pierre deux coups en utilisant le même code pour préciser l'encodage à la fois à Python et à votre éditeur. Dans le cas de GNU Emacs, la ligne à ajouter est la suivante:

# -*- coding: utf-8 -*-

Dans le cas de VIM, il faudra utiliser:

# vim: set fileencoding=utf-8 :

Si vous n'utilisez aucun de ces deux éditeurs, vous pouvez utiliser le code de votre choix: l'important pour vous étant que Python sache quel encodage de caractères vous utilisez.

Comme pour ma part j'utilise VIM, le code programme devient le suivant après cette modification:

#!/usr/bin/python
# vim: set fileencoding=utf-8 :
 
from datetime import date
 
menu = [
    "Les restes de dimanche",
    "Mardi, c'est raviolis",
    "Mercredi, purée",
    "Les coquillettes du jeudi",
    "Vendredi poisson",
    "Samedi soupe",
    "Dimanche surprise!"
]
 
print "Votre menu du jour:"
print menu[date.today().weekday()]

Note:

Ici, j'utilise vraiment l'encodage UTF-8. Si vous avez utilisé un autre encodage pour écrire le fichier source, il faut rester cohérent: c'est donc évidemment l'encodage que vous avez utilisé qu'il faut indiquer dans le fichier!

Maintenant, Python accepte d'exécuter notre programme – et les lettres accentuées s'affichent correctement:

sh$  ./menu.py 
Votre menu du jour:
Mercredi, purée

Référence