2010-04-29 10 views
13

Ich benutze Windows und Linux-Maschinen für das gleiche Projekt. Die Standardcodierung für stdin unter Windows ist cp1252 und unter linux ist utf-8.Wie ändere ich die Stdin-Codierung auf Python

Ich möchte alles zu uft-8 ändern. Ist es möglich? Wie kann ich es tun?

Dank Eduardo

Antwort

18

Sie können dies tun, indem Sie nicht auf die implizite Codierung verlassen, wenn die Dinge zu drucken. Sich darauf nicht zu verlassen, ist in jedem Fall eine gute Idee - die implizite Kodierung wird nur verwendet, wenn auf stdout gedruckt wird und wenn stdout mit einem Terminal verbunden ist.

Ein besserer Ansatz ist es, überall unicode zu verwenden und codecs.open oder codecs.getwriter überall zu verwenden. Sie wickeln sys.stdout in einem Objekt, das Ihre Unicode-Strings in UTF-8 automatisch, beispielsweise codiert:

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

Dies funktioniert nur, wenn Sie Unicode überall verwenden, though. Also, benutze Unicode überall. Wirklich, überall.

+0

Was ist mit Stdin? – duduklein

+2

stdin wird nicht automatisch decodiert, Sie müssen dies also immer selbst tun. Und vorausgesetzt, die Eingabe ist UTF-8 ist wahrscheinlich eine schlechte Idee, aber es gibt 'codecs.getreader ('utf-8') (sys.stdin)' wenn Sie wirklich wollen. –

+0

Beachten Sie, dass Python 3 im Gegensatz zu Python 2 automatisch stdin dekodiert: http://docs.python.org/3/library/sys.html#sys.stdin - dieses Verhalten kann wie in den Dokumenten beschrieben geändert werden. –

12

Dies ist eine alte Frage, aber nur als Referenz.

Um UTF-8 aus stdin verwenden zu lesen:

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

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

Um UTF-8 zu stdout, Verwendung zu schreiben:

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

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

Python erkennt automatisch die Codierung von stdin. Der einfachste Weg, den ich gefunden habe eine Codierung angeben, wenn die automatische Erkennung nicht funktioniert, ist richtig die PYTHONIOENCODING Umgebungsvariable zu verwenden, wie im folgenden Beispiel:

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

Weitere Informationen zur Erkennung codiert, und diese Variable auf verschiedenen Plattformen können Sie die sys.stdin Dokumentation betrachten.

Verwandte Themen