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!
Puede intentar cambiar la variable de entorno "PYTHONIOENCODING" por "utf_8". He escrito una página sobre mi terrible experiencia con este problema .
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.