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?
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.
C'est une vieille question, mais juste pour la référence.
lire UTF-8
stdin
, utilisez:
UTF8Reader = codecs.getreader('utf8')
sys.stdin = UTF8Reader(sys.stdin)
# Then, e.g.:
for _ in sys.stdin:
print _.strip()
écrire UTF-8
stdout
, utilisez:
UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)
# Then, e.g.:
print 'Anything'
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.