2010-08-26 16 views
12

estoy usando Python 2.6 en Windows 7Cómo mostrar UTF-8 en la consola de Windows

Tomé prestado algo de código a partir de aquí: Python, Unicode, and the Windows console

Mi objetivo es ser capaz de muestra cadenas de Uft-8 en la consola de Windows.

Apparantly en Python 2.6, el sys.setdefaultencoding

()

ya no es compatible

Sin embargo, me escribió recarga (sys) antes de que intentara utilizarlo y mágicamente no cometió ningún error.

Este código NO tendrá errores, pero muestra caracteres divertidos en lugar de texto japonés. Creo que el problema se debe a que no he cambiado correctamente la página de códigos de la consola de Windows.

Estos son mis intentos, pero que no funcionan:

reload(sys) 
sys.setdefaultencoding('utf-8') 

print os.popen('chcp 65001').read() 

sys.stdout.encoding = 'cp65001' 

Tal vez se puede utilizar win32console para cambiar la página de códigos? Probé el código del sitio web que conecté, pero también tuve errores en win32console ... tal vez ese código sea obsoleto.

Aquí está mi código, que no error, pero imprime caracteres extraños:

#coding=<utf8> 
import os 
import sys 
import codecs 



reload(sys) 
sys.setdefaultencoding('utf-8') 
sys.stdout = codecs.getwriter('utf8')(sys.stdout) 
sys.stderr = codecs.getwriter('utf8')(sys.stderr) 

#print os.popen('chcp 65001').read() 
print(sys.stdout.encoding) 
sys.stdout.encoding = 'cp65001' 
print(sys.stdout.encoding) 

x = raw_input('press enter to continue') 

a = 'こんにちは世界'#.decode('utf8') 
print a 

x = raw_input() 
+0

No olvides prefijar cadenas Unicode con 'u' – mbomb007

Respuesta

8

Nunca jamás vez uso setdefaultencoding. Si desea escribir cadenas unicode en stdio, codifíquelas explícitamente. Hacer monos con setdefaultencoding hará que los módulos stdlib y los módulos de terceros se rompan de manera sutil y horrible al permitir la conversión implícita entre str y unicode cuando no debería suceder.

Sí, es probable que la página de códigos no esté configurada correctamente. Sin embargo, usar os.popen no cambiará la página de códigos; generará un nuevo intérprete de comandos, cambiará a su página de códigos y luego saldrá inmediatamente sin afectar a la consola en absoluto. Personalmente no estoy muy familiarizado con Windows, por lo que no podría decirte cómo cambiar la página de códigos de tu consola desde tu programa python.

la manera de visualizar correctamente los datos a través de Unicode UTF-8 de pitón, como se mencionó antes, es codificar explícitamente sus cadenas antes de imprimirlas: print s.encode('utf-8')

+1

Con respecto a" Nunca usar setdefaultencoding. " No creo que tu razonamiento sea válido, es insuficiente en el mejor de los casos. De hecho, está bien establecerlo en 'utf-8' ya que ascii es solo un subconjunto de él. Si al configurarlo surge algún problema en un módulo, es el error del módulo. Si se opone, ¿podría mostrarnos contraejemplos? – OTZ

+2

@otz, stdlib y muchas, muchas bibliotecas de terceros suponen que ASCII es la codificación predeterminada de python. Hay una buena discusión sobre por qué configurar la codificación predeterminada es una tontería aquí: http://faassen.n--tree.net/blog/view/weblog/2005/08/02/0 – habnabit

+3

@otz, algunas otras cosas no cubiertas por ese artículo: mezclar texto (cadenas de Unicode) y bytes es una operación sin sentido de todos modos. Si los bytes representan texto, se deben decodificar a unicode de todos modos. Aumentar la probabilidad de que una operación sin sentido tenga éxito accidentalmente sin ninguna advertencia no es exactamente lo mejor si desea escribir un código en su sano juicio. Como ya dije, una gran cantidad de código python existente se basa en que ASCII es el predeterminado; si las codificaciones implícitas se desactivaran, el código se rompería. – habnabit

3

Windows no soporta UTF-8 en una consola correctamente. La única manera que conozco de mostrar el japonés en la consola es cambiando (en XP) las opciones regionales y de idioma del panel de control, la pestaña avanzada, el idioma para los programas no Unicode al japonés. Después de reiniciar, abra una consola y ejecute "chcp" para averiguar la página de códigos de la consola japonesa. A continuación, imprima cadenas Unicode o cadenas de bytes explícitamente codificadas en la página de códigos correcta.

5

Cambiar la página de códigos de la consola es innecesario y no funcionará (en particular, establecerlo en 65001 se ejecuta en un Python bug). Consulte this question para obtener detalles y sobre cómo imprimir caracteres Unicode en la consola independientemente de la página de códigos.

+0

Esto está mal. Para que la salida se muestre correctamente, la página de códigos utilizada debe admitir los caracteres que se están imprimiendo. La fuente de la consola también debe admitir los caracteres. – mbomb007

+0

No, estás equivocado. La única solución que realmente funcionará es * ignorar * páginas de códigos y usar API Unicode, como lo hace mi respuesta a la pregunta que hice. Y este enfoque es perfectamente capaz de mostrar los caracteres que * no * en la página de códigos de la consola. –

+0

Ese problema en la pregunta vinculada solo ocurre si usa 'cp65001' en su código Python en lugar de' utf-8'. La pregunta de OP no requiere tal uso, por lo tanto, la respuesta más votada funciona. – mbomb007

14

Sé que declara que está utilizando Python 2.6, pero si puede usar Python 3.3, encontrará que finalmente es compatible.

Utilice el comando chcp 65001 antes de iniciar Python.

Ver http://docs.python.org/dev/whatsnew/3.3.html#codecs

En Python 3.6 que ya no es ni siquiera necesario utilizar el comando chcp, ya que Python no pasa por la interfaz de la consola a nivel de byte completo y utiliza una interfaz nativa de Unicode en su lugar. Ver PEP 528: Change Windows console encoding to UTF-8.

Como se señala en los comentarios de @ mbom007, también es importante asegurarse de que la consola esté configurada con una fuente que admita los caracteres que intenta mostrar.

+0

La fuente que está usando la consola también debe admitir los caracteres que se están imprimiendo, o se mostrarán como cuadrados. Si el objetivo es el japonés, la fuente "NSimSun" los admite.En Windows 10, esta fuente está en la lista en la página de propiedades del cmd. – mbomb007

+0

@ mbomb007 Gran comentario, agregué algo así a la respuesta. –

+0

Estaba teniendo el mismo problema (con caracteres japoneses), y pasé al menos una hora tratando de hacerlo funcionar. Es bueno que una fuente incorporada los admita. – mbomb007

Cuestiones relacionadas