Je fais tourner un Linux récent système où tous mes paramètres régionaux sont en UTF-8:
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
...
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
Maintenant, je veux écrire codé en UTF-8 contenu de la console.
Droit maintenant, Python utilise UTF-8 pour le FS encodage mais bâtons ASCII pour le codage par défaut :-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
J'ai pensé que le meilleur (propre) façon de le faire était réglage de l' PYTHONIOENCODING
variable d'environnement. Mais il semble que Python ignore. Au moins, sur mon système, je reçois ascii
comme encodage par défaut, même après le réglage de la envvar.
# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8
Si je ne les suivants: au début d'un script, il fonctionne bien:
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
Mais cette approche semble impur. Donc, ce qui est une bonne façon d'accomplir cela?
Solution de contournement
Au lieu de changer l'encodage par défaut - qui n'est pas une bonne idée (voir mesilliac de réponse) - j'ai juste envelopper sys.stdout
avec un StreamWriter
comme ceci:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
Voir ce gist pour une petite fonction d'utilité, qui la gère.