2010-04-29 6 views
13

J'utilise des machines Windows et Linux pour le même projet. L'encodage par défaut pour stdin sur windows est cp1252 et sur linux est utf-8.Comment changer le codage stdin sur python

Je voudrais tout changer à uft-8. Est-ce possible? Comment puis-je le faire?

Merci Eduardo

Répondre

18

Vous pouvez le faire en ne pas compter sur l'encodage implicite quand les choses d'impression. Ne pas s'en remettre est une bonne idée dans tous les cas - l'encodage implicite n'est utilisé que lors de l'impression sur stdout et quand stdout est connecté à un terminal.

Une meilleure approche consiste à utiliser unicode partout, et d'utiliser codecs.open ou codecs.getwriter partout. Vous enveloppez sys.stdout dans un objet qui code automatiquement vos chaînes unicode en UTF-8 en utilisant, par exemple:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout) 

Cela ne fonctionnera que si vous utilisez unicode partout, cependant. Alors, utilisez unicode partout. Vraiment, partout.

+0

Qu'en est-il de stdin? – duduklein

+2

stdin n'est pas décodé automatiquement, vous devez donc toujours le faire vous-même. Et supposer que l'entrée est UTF-8 est probablement une mauvaise idée, mais il y a 'codecs.getreader ('utf-8') (sys.stdin)' si vous le voulez vraiment. –

+0

Notez que contrairement à Python 2, Python 3 décode automatiquement stdin: http://docs.python.org/3/library/sys.html#sys.stdin - ce comportement peut être modifié comme indiqué dans les documents. –

12

Ceci est une vieille question, mais juste pour référence.

Pour lire UTF-8 de stdin, utilisez:

UTF8Reader = codecs.getreader('utf8') 
sys.stdin = UTF8Reader(sys.stdin) 

# Then, e.g.: 
for _ in sys.stdin: 
    print _.strip() 

Pour écrire UTF-8-stdout, utilisez:

UTF8Writer = codecs.getwriter('utf8') 
sys.stdout = UTF8Writer(sys.stdout) 

# Then, e.g.: 
print 'Anything' 
6

Python détecte automatiquement le codage de stdin. La façon la plus simple que j'ai trouvé de spécifier un codage lorsque la détection automatique ne fonctionne pas correctement est d'utiliser la variable d'environnement PYTHONIOENCODING, comme dans l'exemple suivant:

pipeline | PYTHONIOENCODING="UTF-8" /path/to/your-script.py 

Pour plus d'informations sur la détection du codage et cette variable sur différents plates-formes, vous pouvez regarder la documentation sys.stdin.