Solo pensé en mencionar algo aquí con lo que tuve que pasar mucho tiempo experimentando antes de finalmente darme cuenta de lo que estaba pasando. Esto puede ser tan obvio para todos aquí que no se han molestado en mencionarlo. ¡Pero me hubiera ayudado si lo hubieran hecho, así que en ese principio ...!
NB: Estoy usando Jython específicamente, v 2.7, así que posiblemente esto no se aplique a CPython ...
NB2: las dos primeras líneas de mi archivo .py aquí son:
# -*- coding: utf-8 -*-
from __future__ import print_function
El mecanismo de construcción de cadena "%" (AKA "operador de interpolación") también causa problemas ADICIONALES ... Si la codificación predeterminada del "entorno" es ASCII e intenta hacer algo como
print( "bonjour, %s" % "fréd" ) # Call this "print A"
No tendrá dificultades para ejecutar en Eclipse ... En una CLI de Windows (ventana de DOS) encontrará que la codificación es la página de códigos 850 (mi sistema operativo Windows 7) o algo similar, que puede manejar caracteres con acento europeo al menos, por lo que trabajaré
print( u"bonjour, %s" % "fréd" ) # Call this "print B"
También funcionará.
Si, OTOH, dirige a un archivo desde la CLI, la codificación stdout será None, que será ASCII (en mi sistema operativo de todos modos), que no podrá manejar ninguna de las impresiones anteriores ... (codificación temida error).
Entonces podría pensar en redirigir su stdout usando
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
e intente ejecutar en la tubería CLI a un archivo ... Muy extrañamente, la impresión A anterior funcionará ... ¡Pero la impresión B anterior arrojará el error de codificación! Sin embargo, lo siguiente funcionará bien:
print( u"bonjour, " + "fréd" ) # Call this "print C"
La conclusión a la que he llegado (provisionalmente) es que si una cadena que se especifica como una cadena Unicode que utiliza el prefijo "u" se envía al mecanismo de manejo de%, parece implicar el uso de la codificación de entorno predeterminada, independientemente de si ha configurado stdout para redirigir!
La forma en que las personas lidian con esto es una cuestión de elección. Me gustaría que un experto en Unicode dijera por qué sucede esto, si me equivoqué de alguna manera, cuál es la solución preferida para esto, si también se aplica a CPython , si sucede en Python 3, etc., etc.
chcp 65001
antes de ejecutar su script. Esto puede tener problemas, pero a menudo ayuda, y no requiere mucho tipeo (menos deset PYTHONIOENCODING=utf_8
).setx PYTHONENCODING utf-8
hacerlo permanente si desea guardar la escritura.