Actualización: Python 3.6 implementa PEP 528: cambie la codificación de la consola de Windows a UTF-8 : la consola predeterminada en Windows ahora aceptará todos los caracteres Unicode. Internamente, utiliza la misma API Unicode que el win-unicode-consolepaquete mencionado a continuación . print(unicode_string)Debería funcionar ahora.
Me sale un UnicodeEncodeError: 'charmap' codec can't encode character... error
El error significa que los caracteres Unicode que está intentando imprimir no se pueden representar utilizando la chcpcodificación de caracteres de la consola actual ( ). La página de códigos suele ser una codificación de 8 bits, comocp437 que puede representar solo ~ 0x100 caracteres de ~ 1M caracteres Unicode:
>>> u "\ N {SIGNO EURO}". codificar ('cp437')
Rastreo (llamadas recientes más última):
...
UnicodeEncodeError: el códec 'charmap' no puede codificar el carácter '\ u20ac' en la posición 0:
mapas de caracteres para
Supongo que esto se debe a que la consola de Windows no acepta caracteres solo Unicode. ¿Cuál es la mejor manera de evitar esto?
La consola de Windows acepta caracteres Unicode e incluso puede mostrarlos (solo BMP) si la fuente correspondiente está configurada . WriteConsoleW()API debe usarse como se sugiere en la respuesta de @Daira Hopwood . Se puede llamar de forma transparente, es decir, no es necesario y no debe modificar sus scripts si usa el win-unicode-consolepaquete :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Vea ¿Cuál es el trato con Python 3.4, Unicode, diferentes idiomas y Windows?
¿Hay alguna manera de hacer que Python imprima automáticamente en ?lugar de fallar en esta situación?
Si es suficiente para reemplazar todos los caracteres no codificables ?en su caso, entonces podría configurar PYTHONIOENCODINGenvvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
En Python 3.6+, la codificación especificada por PYTHONIOENCODINGenvvar se ignora para las memorias intermedias de consola interactivas a menos que PYTHONLEGACYWINDOWSIOENCODINGenvvar esté configurado en una cadena no vacía.