更新: Python 3.6实现了PEP 528:将Windows控制台编码更改为UTF-8:Windows上的默认控制台现在将接受所有Unicode字符。在内部,它使用与下面提到的win-unicode-console
包相同的Unicode API 。print(unicode_string)
应该现在就可以工作。
我得到一个UnicodeEncodeError: 'charmap' codec can't encode character...
错误。
该错误意味着您尝试打印的Unicode字符无法使用当前(chcp
)控制台字符编码表示。代码页通常是8位编码,例如cp437
只能表示1M Unicode字符中的〜0x100个字符:
>>> u“ \ N {EURO SIGN}”。encode('cp437')
追溯(最近一次通话):
...
UnicodeEncodeError:'charmap'编解码器无法在位置0编码字符'\ u20ac':
字符映射到
我认为这是因为Windows控制台不接受仅Unicode字符。最好的办法是什么?
Windows控制台确实接受Unicode字符,如果配置了相应的字体,它甚至可以显示它们(仅BMP)。WriteConsoleW()
应该按照@Daira Hopwood的答案中的建议使用API 。可以透明地调用它,即,如果您使用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
除非将PYTHONLEGACYWINDOWSIOENCODING
envvar设置为非空字符串,否则交互式控制台缓冲区将忽略envvar 指定的编码。