Supongamos por un momento que no se puede usar print
(y así disfrutar del beneficio de la detección automática de codificación). Entonces eso nos deja con sys.stdout
. Sin embargo, sys.stdout
es tan tonto como not do any sensible encoding.Escribir cadenas unicode a través de sys.stdout en Python
Ahora se lee la página wiki Python PrintFails y se va a probar el siguiente código:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);
Sin embargo esto también no funciona (al menos en Mac). Demasiado ver por qué:
>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'
(UTF-8 es lo que entiende el terminal).
Así se cambia el código anterior para:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);
Y ahora cadenas Unicode se envían correctamente a sys.stdout
y por lo tanto impresos correctamente en el terminal (sys.stdout
está unido al terminal).
¿Es esta la forma correcta de escribir cadenas de Unicode en sys.stdout
o debería estar haciendo otra cosa?
EDITAR: a veces - por ejemplo, cuando la tubería de la salida a less
- sys.stdout.encoding
será None
. en este caso, el código anterior fallará.
s/my/la de uno/para la coherencia – icedwater