54 votes

Comment imprimer du texte encodé UTF-8 sur la console en Python <3?

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.

29voto

mesilliac Points 1068

Il semble accomplir ceci n'est pas recommandé.

Fedora a suggéré en utilisant les paramètres régionaux système par défaut, mais apparemment, cela pose d'autres choses.

Voici une citation de la liste de diffusion de discussion:

La seule prise en charge par défaut des codages dans les Python sont:

 Python 2.x: ASCII
 Python 3.x: UTF-8

Si vous modifiez ces, vous êtes sur votre propre, et que d'étranges choses se
commencent à se produire. L'encodage par défaut n'affecte pas seulement
la traduction entre Python et le monde extérieur, mais aussi
toutes les conversions entre les 8 bits de chaînes de caractères et Unicode.

Hacks comme ce qui se passe dans le pango (module de réglage de la
encodage par défaut à 'utf-8' par le rechargement du module du site dans
afin d'obtenir le sys.setdefaultencoding() de l'API à l'arrière) sont juste
carrément mauvais et peut causer des problèmes graves depuis Unicode
les objets du cache par défaut codé représentation.

Merci de ne pas permettre l'utilisation d'un jeu de paramètres régionaux par défaut en fonction de l'encodage.

Si tout ce que vous voulez atteindre est d'obtenir les codages de
stdin, stdout et correctement le programme d'installation de la tuyauterie, vous devez
au lieu de changer la .attribut de codage de ces (seulement).

-- 
Marc-André Lemburg
eGenix.com

24voto

Keith Points 13800

Voici comment je le fais:

 #!/usr/bin/python2.7 -S

import sys
sys.setdefaultencoding("utf-8")
import site
 

Notez le -S dans la ligne de repère. Cela indique à Python de ne pas importer automatiquement le module site . Le module site est ce qui définit le codage par défaut et supprime la méthode afin qu'il ne puisse pas être défini à nouveau. Mais honorera ce qui est déjà défini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X