Atualização: Python 3.6 implementa PEP 528: Altere a codificação do console do Windows para UTF-8 : o console padrão no Windows agora aceitará todos os caracteres Unicode. Internamente, ele usa a mesma API Unicode que o win-unicode-console
pacote mencionado abaixo . print(unicode_string)
deve funcionar agora.
Eu recebo um UnicodeEncodeError: 'charmap' codec can't encode character...
erro.
O erro significa que os caracteres Unicode que você está tentando imprimir não podem ser representados usando a chcp
codificação de caracteres do console atual ( ). A página de código geralmente é uma codificação de 8 bits, cp437
que pode representar apenas ~ 0x100 caracteres a partir de ~ 1M caracteres Unicode:
>>> u "\ N {EURO SIGN}". encode ('cp437')
Traceback (última chamada mais recente):
...
UnicodeEncodeError: o codec 'charmap' não pode codificar o caractere '\ u20ac' na posição 0:
mapas de caracteres para
Suponho que isso ocorre porque o console do Windows não aceita caracteres somente Unicode. Qual é a melhor maneira de contornar isso?
O console do Windows aceita caracteres Unicode e pode até exibi-los (somente BMP) se a fonte correspondente estiver configurada . WriteConsoleW()
A API deve ser usada conforme sugerido na resposta de @Daira Hopwood . Pode ser chamado de forma transparente, ou seja, você não precisa e não deve modificar seus scripts se usar o win-unicode-console
pacote :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Veja Qual é o problema do Python 3.4, Unicode, diferentes idiomas e Windows?
Existe alguma maneira de fazer o Python imprimir automaticamente um em ?
vez de falhar nessa situação?
Se for suficiente substituir todos os caracteres não codificáveis por ?
no seu caso, você poderá definir PYTHONIOENCODING
envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
No Python 3.6+, a codificação especificada por PYTHONIOENCODING
envvar é ignorada para buffers de console interativos, a menos que PYTHONLEGACYWINDOWSIOENCODING
envvar seja definido como uma seqüência de caracteres não vazia.