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