Python 3.0, cómo hacer que print () produzca unicode?

Estoy trabajando en WinXP 5.1.2600, escribiendo una aplicación de Python que involucra pinyin chino, que me ha involucrado en interminables problemas Unicode. Cambiar a Python 3.0 ha resuelto muchos de ellos. Pero la función de impresión () para la salida de la consola no es consciente de Unicode por algún motivo extraño. Aquí hay un progtwig pequeño.

print('sys.stdout encoding is "' + sys.stdout.encoding + '"') str1 = 'lüelā' print(str1) 

La salida es (cambiando los corchetes angulares a corchetes para la legibilidad):

     La encoding sys.stdout es "cp1252"
     Rastreo (llamadas recientes más última):
       Archivo "TestPrintEncoding.py", línea 22, en [módulo]
         imprimir (str1)
       Archivo "C: \ Python30 \ lib \ io.py", línea 1491, en escritura
         b = encoder.encode (s)
       Archivo "C: \ Python30 \ lib \ codificaciones \ cp1252.py", línea 19, en encoding
         return codecs.charmap_encode (input, self.errors, encoding_table) [0]
     UnicodeEncodeError: el códec 'charmap' no puede codificar el carácter '\ u0101' 
     en la posición 4: mapas de caracteres a [indefinido]

Tenga en cuenta que ü = \ xfc = 252 no da ningún problema ya que es ASCII superior. Pero ā = \ u0101 está más allá de 8 bits.

¿Alguien tiene una idea de cómo cambiar la encoding de sys.stdout a ‘utf-8’? Tenga en cuenta que Python 3.0 ya no usa el módulo de codecs , si entiendo bien la documentación.


Disculpas, te di el progtwig sin el preámbulo. Antes de las 3 líneas dadas, comienza así:

 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys 

Desafortunadamente, la encoding especificada por la línea “encoding:” es la encoding del código fuente , no de la salida de la consola. ¡Pero gracias por tus pensamientos!

El símbolo del sistema de Windows (cmd.exe) no puede mostrar los caracteres Unicode que está utilizando, aunque Python lo esté manejando de manera correcta internamente. Necesita usar IDLE, Cygwin u otro progtwig que pueda mostrar Unicode correctamente.

Vea este hilo para una explicación completa: http://www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

Puede intentar cambiar la variable de entorno “PYTHONIOENCODING” por “utf_8”. He escrito una página sobre mi terrible experiencia con este problema .

Mira la pregunta y la respuesta aquí , creo que tienen algunas pistas valiosas. Específicamente, tenga en cuenta el setdefaultencoding en el módulo sys , pero también el hecho de que probablemente no debería usarlo.

Aquí hay un truco sucio:

 # works import os os.system("chcp 65001 &") print("юникод") 

Sin embargo, todo lo rompe:

  • la primera línea de silenciamiento simple ya lo rompe:

     # doesn't work import os os.system("chcp 65001 >nul &") print("юникод") 
  • comprobar el tipo de sistema operativo lo rompe:

     # doesn't work import os if os.name == "nt": os.system("chcp 65001 &") print("юникод") 
  • ni siquiera funciona en bloque si:

     # doesn't work import os if os.name == "nt": os.system("chcp 65001 &") print("юникод") 

Pero uno puede imprimir con el eco de cmd:

 # works import os os.system("chcp 65001 & echo {0}".format("юникод")) 

y aquí hay una manera simple de hacer esta multiplataforma:

 # works import os def simple_cross_platrofm_print(obj): if os.name == "nt": os.system("chcp 65001 >nul & echo {0}".format(obj)) else: print(obj) simple_cross_platrofm_print("юникод") 

pero la línea vacía de echo la ventana no puede ser suprimida.

El problema de mostrar charaters Unicode en Python en Windows es conocido. No hay una solución oficial todavía. Lo correcto es usar la función winapi WriteConsoleW. No es trivial construir una solución de trabajo ya que hay otros problemas relacionados. Sin embargo, he desarrollado un paquete que intenta arreglar Python con respecto a este problema. Ver https://github.com/Drekin/win-unicode-console . También puede leer allí una explicación más profunda del problema. El paquete también está en pypi ( https://pypi.python.org/pypi/win_unicode_console ) y se puede instalar usando pip.