Обновление: Python 3.6 реализует PEP 528: измените кодировку консоли Windows на UTF-8 : консоль по умолчанию в Windows теперь будет принимать все символы Unicode. Внутри он использует тот же Unicode API, что и win-unicode-consoleупомянутый ниже пакет . print(unicode_string)должен просто работать сейчас.
Я получаю UnicodeEncodeError: 'charmap' codec can't encode character... ошибку
Ошибка означает, что символы Юникода, которые вы пытаетесь напечатать, не могут быть представлены с использованием chcpкодировки символов консоли current ( ). Кодовая страница часто представляет собой 8-битную кодировку, например, cp437которая может представлять только ~ 0x100 символов из ~ 1M символов Unicode:
>>> u "\ N {ЗНАК ЕВРО}". encode ('cp437')
Отслеживание (последний вызов последний):
...
UnicodeEncodeError: кодек 'charmap' не может кодировать символ '\ u20ac' в позиции 0:
символы отображаются на
Я предполагаю, что это связано с тем, что консоль Windows не принимает символы только Unicode. Как лучше всего обойти это?
Консоль Windows принимает символы Unicode и даже может отображать их (только BMP), если настроен соответствующий шрифт . WriteConsoleW()API следует использовать, как предложено в ответе @Daira Hopwood . Его можно вызывать прозрачно, то есть вам не нужно и не следует изменять свои скрипты, если вы используете win-unicode-consolepackage :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Посмотрите, что такое Python 3.4, Unicode, разные языки и Windows?
Есть ли способ заставить Python автоматически печатать a ?вместо сбоя в этой ситуации?
Если ?в вашем случае достаточно заменить все некодируемые символы на, вы можете установить PYTHONIOENCODINGenvvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
В Python 3.6+ кодировка, указанная PYTHONIOENCODINGenvvar, игнорируется для буферов интерактивной консоли, если PYTHONLEGACYWINDOWSIOENCODINGenvvar не установлена в непустую строку.