2009-02-03 8 views
18

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 programa pequeño.python 3.0, cómo hacer que print() genere unicode?

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

salida está (cambiando paréntesis angulares de corchetes para facilitar la lectura):

 
    sys.stdout encoding is "cp1252" 
    Traceback (most recent call last): 
     File "TestPrintEncoding.py", line 22, in [module] 
     print(str1) 
     File "C:\Python30\lib\io.py", line 1491, in write 
     b = encoder.encode(s) 
     File "C:\Python30\lib\encodings\cp1252.py", line 19, in encode 
     return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
    UnicodeEncodeError: 'charmap' codec can't encode character '\u0101' 
    in position 4: character maps to [undefined] 

Tenga en cuenta que U = \ xfc = 252 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 codificación de sys.stdout a 'utf-8'? Tenga en cuenta que Python 3.0 ya no usa el módulo codecs, si entiendo bien la documentación.


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

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

import sys 

Por desgracia, la codificación especificada por la "codificación:" la línea es la codificación del código fuente , no de la salida de la consola. ¡Pero gracias por tus pensamientos!

Respuesta

15

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 programa que pueda mostrar Unicode correctamente.

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

+7

cmd.exe puede mostrar caracteres Unicode si utiliza una fuente que puede mostrar los caracteres Unicode deseados, y si cambia la página de códigos a utf-8 (puede hacerlo con: 'CHCP 65001') – smerlin

+0

Eso no funciona realmente funciona de manera confiable ... además de que MSDN recomienda usar UTF-16, la codificación nativa de todos los sistemas operativos de Windows NT. – dom0

+0

@csde_rats ¿no usan el UCS-2 de ancho fijo más antiguo en lugar de UTF-16? – Kos

2

Salida de preguntas y respuestas here, creo que tienen algunas pistas valiosas. Específicamente, tenga en cuenta setdefaultencoding en el módulo sys, pero también el hecho de que probablemente no deba usarlo.

1

Se conoce el problema de mostrar charaters Unicode en Python en Windows. 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.

+0

upvote, 'py -mpip install win-unicode-console & py -mrun your_script.py' es la solución para imprimir Unicode en la consola de Windows con cmd.exe en Python 3 (make asegúrese de haber configurado las fuentes adecuadas para la ventana de la consola). – jfs

+0

@ J.F.Sebastian Usar 'run' ahora se considera subóptimo. 'ejecutar' era necesario cuando no sabía acerca de los ganchos de línea de lectura personalizados. 'win_unicode_console.enable()' es suficiente y se puede poner en 'sitecustomize' para que se ejecute automáticamente. Luego puede ejecutar su script de la forma habitual: 'py your_script.py'. – user87690

+0

No quiero el código win-unicode-console en mi script ('py -mrun' me permite eso). A menudo ejecuto el mismo script en Python 2 en Unix donde 'print (unicode_text)' funciona como está. Modificar el módulo 'sitecustomize' es demasiado intrusivo para mí. Puede afectar el código no relacionado. Para redirigir la salida a un archivo, configuro PYTHONIOENCODING y ejecuto 'py your_script.py> output.txt'. – jfs

1

Aquí es un truco sucio:

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

Sin embargo, todo lo rompe:

  • sencilla silenciamiento primera línea ya lo rompe:

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

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

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

Pero se puede imprimir con el eco del cmd:

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

y he aquí una forma sencilla de hacer esta cruz -plataforma:

# 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 la línea vacía echo de la ventana no puede ser suprimida.

Cuestiones relacionadas