python3 imprimir unicode a la consola de windows xp codificar cp437

Ok, quiero imprimir una cadena en mi consola de Windows XP. Hay varios caracteres que la consola no puede imprimir, así que tengo que codificar en stdout.encoding, que es ‘cp437’. pero al imprimir la cadena codificada, ‘ß’ se imprime como ‘\ xe1’. Después de decodificar de nuevo a Unicode e imprimir la cadena, obtengo la salida que deseo. pero esto se siente un poco mal. ¿cómo es la forma correcta de imprimir una cuerda y obtener? para caracteres no imprimibles?

>>>var 'Bla \u2013 großes' >>>print(var) UnicodeEncodeError: 'charmap' codec can't encode character '\u2013' >>>var.encode('cp437', 'replace') b'Bla ? gro\xe1es' >>>print(var.encode('cp437', 'replace')) b'Bla ? gro\xe1es' >>>var.encode('cp437', 'replace').decode('cp437') 'Bla ? großes' >>>print(var.encode('cp437', 'replace').decode('cp437')) Bla ? großes 

edit: @Mark Ransom: dado que imprimo mucho, esto hace que el código esté bastante hinchado, siento: /

@eryksun: explícitamente lo que estaba buscando. ¡muchas gracias!

Para imprimir caracteres Unicode que no se pueden representar utilizando la página de códigos de la consola, puede usar el paquete de Python win-unicode-console que usa la API Unicode como ReadConsoleW/WriteConsoleW() para leer / escribir Unicode desde / a la consola de Windows directamente:

 #!/usr/bin/env python3 import win_unicode_console win_unicode_console.enable() try: print('Bla \u2013 großes') finally: win_unicode_console.disable() 

guárdelo en el archivo test_unicode.py y ejecútelo:

 C:\> py test_unicode.py 

Debería ver:

 Bla – großes 

Como alternativa preferida, puede usar el módulo de run (incluido en el paquete) para ejecutar una secuencia de comandos normal con la compatibilidad de Unicode habilitada en la consola de Windows:

 C:\> py -m run unmodified_script_that_prints_unicode.py 

Para instalar el módulo win_unicode_console , ejecute:

 C:\> pip install win-unicode-console 

Asegúrese de seleccionar una fuente capaz de mostrar caracteres Unicode en la consola de Windows.


Para guardar el resultado de una secuencia de comandos de Python en un archivo, puede usar PYTHONIOENCODING envvar:

 C:\> set PYTHONIOENCODING=utf-8:backslashreplace C:\> py unmodified_script_that_prints_unicode.py >output_utf8.txt 

No codifique la encoding de caracteres de su entorno dentro de su script, imprima Unicode en su lugar. Los ejemplos muestran que el mismo script se puede usar para imprimir en la consola y en un archivo usando codificaciones y métodos diferentes.

Una solución alternativa es no utilizar la consola de Windows paralizada para la salida de Unicode general. Los widgets de texto de Tk (a los que se accede como instancias de texto de tkinter) manejan todos los caracteres BMP siempre que lo haga la fuente seleccionada.

Como Idle usó tkinter, también puede hacerlo. Ejecutar un archivo de editor inactivo (llámalo tem.py) que contiene

 print('Bla \u2013 großes') 

imprime lo siguiente en la ventana de Shell.

 Bla – großes 

Un archivo se puede ejecutar a través de Idle desde la consola con -m y -r.

 C:\>python -m idlelib -rc:/programs/python34/tem.py 

Esto abre una ventana de shell e imprime lo mismo que arriba. O puede crear su propia ventana tk con el widget Etiqueta o Texto.