Comment changer l'encodage stdin sur python

j'utilise des machines windows et linux pour le même projet. L'encodage par défaut pour stdin sous windows est cp1252 et sous linux utf-8.

je voudrais tout changer en uft-8. Est-il possible? Comment puis-je le faire?

16
demandé sur tripleee 2010-04-29 18:07:33

3 réponses

vous pouvez le faire en ne comptant pas sur l'encodage implicite lors de l'impression des choses. Ne pas se fier à cela est une bonne idée dans tous les cas -- l'encodage implicite n'est utilisé que lors de l'impression sur stdout et lorsque stdout est connecté à un terminal.

Une meilleure approche est d'utiliser unicode partout, et 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)

ce sera seulement travail si vous utilisez unicode partout, cependant. Utilisez unicode partout. Vraiment, partout.

18
répondu Thomas Wouters 2010-04-29 14:12:18

C'est une vieille question, mais juste pour la référence.

lire UTF-8stdin, utilisez:

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

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

écrire UTF-8stdout, utilisez:

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

# Then, e.g.:
print 'Anything'
16
répondu Tomasz Nguyen 2014-12-11 14:58:04

Python détecte automatiquement l'encodage de stdin. Le moyen le plus simple que j'ai trouvé pour spécifier un encodage quand la détection automatique ne fonctionne pas correctement est d'utiliser le PYTHONIOENCODING variable d'environnement, comme dans l'exemple suivant:

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

pour plus d'informations sur la détection d'encodage et cette variable sur les différentes plateformes, vous pouvez regarder le sys.stdin documentation.

7
répondu johnf 2016-02-06 02:35:24