write variable python3 print open how examples and unicode console printing python-3.x stdout

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



python3 print variable and text (5)

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.

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

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 compatible con Unicode por algún motivo extraño. Aquí hay un programa 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):

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 ü = / 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 codificación 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 programa sin el preámbulo. Antes de las 3 líneas dadas, comienza así:

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

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



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.


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.