L'astuce est de garder tout le traitement des chaînes dans le source complètement Unicode. Décodez en Unicode lors de la lecture des entrées (fichiers/pipes/console) et encodez lors de l'écriture des sorties. Si category['name']
est Unicode, gardez-le comme tel (supprimez `.encode('utf8').
Aussi par votre commentaire :
Cependant, l'erreur se produit toujours lorsque j'essaie de faire : python venues.py > categories.txt, mais pas lorsque la sortie va dans le terminal : python venues.py
Python peut généralement déterminer l'encodage du terminal et l'encoder automatiquement, ce qui explique pourquoi l'écriture dans le terminal fonctionne. Si vous utilisez la redirection de l'interpréteur de commandes pour écrire dans un fichier, vous devez indiquer à Python l'encodage d'E/S que vous souhaitez via une variable d'environnement, par exemple :
set PYTHONIOENCODING=utf8
python venues.py > categories.txt
Exemple de travail, en utilisant ma console Windows américaine qui utilise cp437
encodage. Le code source est enregistré en "UTF-8 sans BOM". Il est utile de souligner que le code source sont UTF-8, mais le fait de déclarer l'encodage de la source et d'utiliser une chaîne Unicode dans permet à Python de décoder la source correctement, et d'encoder les octets print
sortie automatique vers le terminal en utilisant son encodage par défaut
#coding:utf8
import sys
print sys.stdout.encoding
print u'üéâäàåçêëèïîì'
Ici, Python utilise l'encodage par défaut du terminal, mais lorsqu'il est redirigé, il ne sait pas quel est l'encodage, et utilise donc par défaut le code suivant ascii
:
C:\>python example.py
cp437
üéâäàåçêëèïîì
C:\>python example.py >out.txt
Traceback (most recent call last):
File "example.py", line 4, in <module>
print u'üéâäàåçêëèïîì'
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12: ordinal not in range(128)
C:\>type out.txt
None
Puisque nous utilisons la redirection du shell, utilisez une variable shell pour indiquer à Python quel encodage utiliser :
C:\>set PYTHONIOENCODING=cp437
C:\>python example.py >out.txt
C:\>type out.txt
cp437
üéâäàåçêëèïîì
On peut aussi forcer Python à utiliser un autre encodage, mais dans ce cas le terminal ne sait pas comment afficher UTF-8
. Le terminal continue à décoder les octets du fichier à l'aide de la fonction cp437
:
C:\>set PYTHONIOENCODING=utf8
C:\>python example.py >out.txt
C:\>type out.txt
utf8
üéâäàåçêëèïîì