Python,Unicode和Windows控制台

当我尝试在Windows控制台中打印Unicode字符串时,出现UnicodeEncodeError: 'charmap' codec can't encode character ....错误。 我认为这是因为Windows控制台不接受仅Unicode字符。 最好的解决办法是什么? 有什么办法可以让Python自动打印? 而不是在这种情况下失败?

编辑:我正在使用Python 2.5。


注意: @ LasseV.Karlsen的答案与复选标记有些过时(从2008年开始)。 请谨慎使用下面的解决方案/答案/建议!

从今天起(2016年1月6日),@JFSebastian答案更具相关性。


注意:这个答案有些过时(从2008年开始)。 请小心使用下面的解决方案!


这是一个详细描述问题和解决方案的页面(搜索页面以查找将sys.stdout包装到实例中的文本):

PrintFails - Python Wiki

以下是该页面的代码摘录:

$ python -c 'import sys, codecs, locale; print sys.stdout.encoding; 
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); 
    line = u"u0411n"; print type(line), len(line); 
    sys.stdout.write(line); print line'
  UTF-8
  <type 'unicode'> 2
  Б
  Б

  $ python -c 'import sys, codecs, locale; print sys.stdout.encoding; 
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); 
    line = u"u0411n"; print type(line), len(line); 
    sys.stdout.write(line); print line' | cat
  None
  <type 'unicode'> 2
  Б
  Б

该页面还有更多信息,非常值得一读。


更新: 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 ,它可以表示cp437 Unicode字符中的cp437字符:

>>> 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控制台确实接受Unicode字符, 如果配置了相应的字体 ,它甚至可以显示它们(仅限BMP)。 WriteConsoleW() API应按照@Daira Hopwood的回答建议使用。 它可以透明地调用,即,如果使用win-unicode-console包,则不需要也不应该修改脚本:

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+中,除非PYTHONLEGACYWINDOWSIOENCODING envvar设置为非空字符串,否则对于交互式控制台缓冲区,由PYTHONIOENCODING envvar指定的编码将被忽略。


尽管其他合理的听起来的答案,建议将代码页更改为65001,这是行不通的。 (另外,使用sys.setdefaultencoding更改默认编码不是一个好主意。)

看到这个问题的细节和代码,确实工作。

链接地址: http://www.djcxy.com/p/85233.html

上一篇: Python, Unicode, and the Windows console

下一篇: Extracting number from NSString