2010-04-29 19 views
13

Estoy usando máquinas de Windows y Linux para el mismo proyecto. La codificación predeterminada para stdin en Windows es cp1252 y en Linux es utf-8.Cómo cambiar la codificación stdin en python

Me gustaría cambiar todo a uft-8. ¿Es posible? ¿Cómo puedo hacerlo?

Gracias Eduardo

Respuesta

18

Usted puede hacer esto por no depender de la codificación implícita al imprimir cosas. No confiar en eso es una buena idea en cualquier caso: la codificación implícita solo se usa cuando se imprime en stdout y cuando stdout está conectada a un terminal.

Un mejor enfoque es utilizar unicode en todas partes, y usar codecs.open o codecs.getwriter en todas partes. Se envuelve sys.stdout en un objeto que codifica automáticamente sus cadenas Unicode en UTF-8, utilizando, por ejemplo:

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

Esto sólo funcionará si se utiliza Unicode en todas partes, sin embargo. Por lo tanto, use unicode en todas partes. Realmente, en todas partes.

+0

¿Qué pasa con stdin? – duduklein

+2

stdin no se decodifica automáticamente, por lo que siempre debe hacerlo usted mismo. Y suponiendo que la entrada sea UTF-8 es probablemente una mala idea, pero hay 'codecs.getreader ('utf-8') (sys.stdin)' si realmente quieres. –

+0

Tenga en cuenta que, a diferencia de Python 2, Python 3 decodifica automáticamente stdin: http://docs.python.org/3/library/sys.html#sys.stdin; este comportamiento puede modificarse como se indica en los documentos. –

12

Esta es una pregunta anterior, pero para su referencia.

Para leer UTF-8 de stdin, utilice:

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

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

Para escribir UTF-8 a stdout, utilice:

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

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

Python detecta automáticamente la codificación de la entrada estándar. La forma más sencilla que he encontrado para especificar una codificación cuando la detección automática no funciona correctamente es utilizar la variable PYTHONIOENCODING medio ambiente, como en el siguiente ejemplo:

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

Para obtener más información sobre la codificación y detección de esta variable sobre diferentes plataformas puede mirar la documentación sys.stdin.

Cuestiones relacionadas