Обновление: 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-console
package :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Посмотрите, что такое Python 3.4, Unicode, разные языки и Windows?
Есть ли способ заставить Python автоматически печатать a ?
вместо сбоя в этой ситуации?
Если ?
в вашем случае достаточно заменить все некодируемые символы на, вы можете установить PYTHONIOENCODING
envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
В Python 3.6+ кодировка, указанная PYTHONIOENCODING
envvar, игнорируется для буферов интерактивной консоли, если PYTHONLEGACYWINDOWSIOENCODING
envvar не установлена в непустую строку.