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

编辑:我正在使用Python 2.5。


注意:带有对勾标记的@ LasseV.Karlsen答案已过时(自2008年起)。 请谨慎使用以下解决方案/答案/建议!

截至今天(2016年1月6日), @ JFSebastian的答案更有意义。

===============>>#1 票数:70

更新: Python 3.6实现了PEP 528:将Windows控制台编码更改为UTF-8Windows上的默认控制台现在将接受所有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')
Traceback (most recent call last):
...
UnicodeEncodeError: 'charmap' codec can't encode character '\u20ac' in position 0:
character maps to

我认为这是因为Windows控制台不接受仅Unicode字符。 最好的办法是什么?

Windows控制台确实接受Unicode字符, 如果配置了相应的字体 ,它甚至可以显示它们(仅BMP)。 应该按照@Daira Hopwood的答案中的建议使用WriteConsoleW() API。 可以透明地调用它,即,如果您使用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 PYTHONIOENCODING ,除非PYTHONLEGACYWINDOWSIOENCODING envvar设置为非空字符串,否则交互式控制台缓冲区将忽略由PYTHONIOENCODING envvar指定的编码。

===============>>#2 票数:36 已采纳

注意:这个答案有点过时了(从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"\u0411\n"; 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"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line' | cat
  None
  <type 'unicode'> 2
  Б
  Б

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

===============>>#3 票数:27

尽管有其他合理的答案建议将代码页更改为65001,但该方法无效 (此外,使用sys.setdefaultencoding更改默认编码sys.setdefaultencoding一个好主意 。)

请参阅此问题,以获取有效的详细信息和代码。

===============>>#4 票数:14

如果您不希望获得可靠的坏字符表示形式,则可以使用类似的方法(使用python> = 2.6,包括3.x):

from __future__ import print_function
import sys

def safeprint(s):
    try:
        print(s)
    except UnicodeEncodeError:
        if sys.version_info >= (3,):
            print(s.encode('utf8').decode(sys.stdout.encoding))
        else:
            print(s.encode('utf8'))

safeprint(u"\N{EM DASH}")

字符串中的错误字符将转换为Windows控制台可打印的表示形式。

===============>>#5 票数:10

以下代码即使在Windows上也可以将Python输出作为UTF-8控制台输出。

控制台将在Windows 7上很好地显示字符,但在Windows XP上将不会很好地显示字符,但是至少它可以正常工作,最重要的是,您将在所有平台上从脚本获得一致的输出。 您将能够将输出重定向到文件。

以下代码已在Windows上使用Python 2.6进行了测试。


#!/usr/bin/python
# -*- coding: UTF-8 -*-

import codecs, sys

reload(sys)
sys.setdefaultencoding('utf-8')

print sys.getdefaultencoding()

if sys.platform == 'win32':
    try:
        import win32console 
    except:
        print "Python Win32 Extensions module is required.\n You can download it from https://sourceforge.net/projects/pywin32/ (x86 and x64 builds are available)\n"
        exit(-1)
    # win32console implementation  of SetConsoleCP does not return a value
    # CP_UTF8 = 65001
    win32console.SetConsoleCP(65001)
    if (win32console.GetConsoleCP() != 65001):
        raise Exception ("Cannot set console codepage to 65001 (UTF-8)")
    win32console.SetConsoleOutputCP(65001)
    if (win32console.GetConsoleOutputCP() != 65001):
        raise Exception ("Cannot set console output codepage to 65001 (UTF-8)")

#import sys, codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

print "This is an Е乂αmp١ȅ testing Unicode support using Arabic, Latin, Cyrillic, Greek, Hebrew and CJK code points.\n"

===============>>#6 票数:4

就像GiampaoloRodolà的回答一样,但更加肮脏:我真的很想花很长时间(很快)来理解编码的整个主题以及它们如何应用于Windoze控制台,

就目前而言,我只想要sthg,这意味着我的程序不会崩溃,并且我了解...而且也没有涉及导入过多的外来模块(特别是我正在使用Jython,所以一半的时间是Python模块实际上并不可用)。

def pr(s):
    try:
        print(s)
    except UnicodeEncodeError:
        for c in s:
            try:
                print( c, end='')
            except UnicodeEncodeError:
                print( '?', end='')

注意:“ pr”的键入比“ print”的键入短(并且比“ safeprint”的键入要短很多)...!

===============>>#7 票数:4

只需在执行python脚本之前在命令行中输入以下代码即可:

chcp 65001 & set PYTHONIOENCODING=utf-8

===============>>#8 票数:3

对于Python 2,请尝试:

print unicode(string, 'unicode-escape')

对于Python 3,请尝试:

import os
string = "002 Could've Would've Should've"
os.system('echo ' + string)

或者尝试使用win-unicode-console:

pip install win-unicode-console
py -mrun your_script.py

===============>>#9 票数:3

TL; DR:

print(yourstring.encode('ascii','replace'));

我自己遇到了这个问题,正在使用Twitch聊天(IRC)机器人。 (最新的Python 2.7)

我想解析聊天消息以便回复...

msg = s.recv(1024).decode("utf-8")

并以人类可读的格式将它们安全地打印到控制台:

print(msg.encode('ascii','replace'));

这更正了机器人UnicodeEncodeError: 'charmap'错误的问题,并用?替换了Unicode字符?

===============>>#10 票数:2

您出现问题的原因不是 Win控制台不愿意接受Unicode(因为这样做是因为我猜默认是Win2k)。 它是默认的系统编码。 试试下面的代码,看看它能为您带来什么:

import sys
sys.getdefaultencoding()

如果显示ascii,那是您的原因;-)您必须创建一个名为sitecustomize.py的文件,并将其放在python路径下(我将其放在/usr/lib/python2.5/site-packages下,但在Win-它是c:\\ python \\ lib \\ site-packages之类的东西,具有以下内容:

import sys
sys.setdefaultencoding('utf-8')

也许您可能还需要在文件中指定编码:

# -*- coding: UTF-8 -*-
import sys,time

编辑:更多信息可以在优秀的《深入Python》一书中找到

===============>>#11 票数:1

肯尼迪·塞巴斯蒂安(JF Sebastian)的答案与之相关,但更为直接。

如果在打印到控制台/终端时遇到此问题,请执行以下操作:

>set PYTHONIOENCODING=UTF-8

===============>>#12 票数:1

Python 3.6 Windows7:有几种启动python的方法,您可以使用python控制台(上面带有python徽标)或Windows控制台(上面写有cmd.exe)。

我无法在Windows控制台中打印utf8字符。 打印utf-8字符会引发此错误:

OSError: [winError 87] The paraneter is incorrect 
Exception ignored in: (_io-TextIOwrapper name='(stdout)' mode='w' ' encoding='utf8') 
OSError: [WinError 87] The parameter is incorrect 

在尝试并且无法理解以上答案之后,我发现这只是一个设置问题。 右键单击cmd控制台窗口的顶部,在选项卡font选择lucida控制台。

===============>>#13 票数:0

詹姆斯·苏拉克(James Sulak)问,

有什么办法可以使Python自动打印? 而不是在这种情况下失败?

其他解决方案建议我们尝试修改Windows环境或替换Python的print()函数。 下面的答案更接近满足Sulak的要求。

在Windows 7下,可以使Python 3.5打印Unicode,而不会UnicodeEncodeError ,如下所示:

代替: print(text)
替代: print(str(text).encode('utf-8'))

现在,Python不会抛出异常,而是将不可打印的Unicode字符显示为\\ xNN十六进制代码,例如:

Halmalo n \\ xe2 \\ x80 \\ x99 \\ xc3 \\ xa9tait加上qu \\ xe2 \\ x80 \\ x99un点黑色

代替

Halmalon'était加qu'un点黑色

诚然,后者是更可取的ceteris paribus ,但否则前者对于诊断消息是完全准确的。 因为它将Unicode显示为文字字节值,所以前者还可以帮助诊断编码/解码问题。

注意:需要上面的str()调用,因为否则否则encode()会导致Python拒绝将Unicode字符作为数字元组。

  ask by James Sulak translate from so

未解决问题?本站智能推荐: