Python打印无法同时打印Unicode和字符串

时间:2015-09-24 17:10:25

标签: python unicode

以下是我观察到的少数病例。想知道为什么Python的打印行为像这样,以及可能的修复。

>>> print "%s" % u"abc" # works
>>> print "%s" % "\xd1\x81" # works
>>> print "%s %s" % (u"abc", "\xd1\x81") # Error

对于上述(最后),我得到:UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128)

但是,这有效

>>> print "%s %s" % ("abc", "\xd17\x81") # works

当我做的时候

>>> print "%s %s" % (u"abc", u"\u0441") # Error

提出UnicodeEncodeError: 'charmap' codec can't encode character u'\u0441' in position 4: character maps to <undefined>

2 个答案:

答案 0 :(得分:2)

在Python 2中混合Unicode字符串和字节字符串时,字节字符串使用默认的ascii编解码器隐式强制转换为Unicode。如果失败,您将获得UnicodeDecodeError

当您打印Unicode字符串时,它们会以当前输出编码进行隐式编码。如果失败,您将获得UnicodeEncodeError

所以:

>>> print "%s" % u"abc"

真的是:

>>> print unicode("%s",'ascii') % u"abc" # and valid

但是,如果您的意思是“不抛出错误”,则以下内容才有效。如果您希望它打印U + 0441字符,只有在输出编码为UTF-8时才会这样做。它在我的Windows系统上打印垃圾。

>>> print "%s" % "\xd1\x81"

由于隐式Unicode解码,以下内容会出错:

print "%s %s" % (u"abc", "\xd1\x81")

这是真的:

print unicode("%s %s",'ascii') % (u"abc", unicode("\xd1\x81",'ascii'))

\xd10x81超出了0-7Fh的ASCII范围。

最后一个错误意味着您的输出编码不是UTF-8,因为它无法将\u0441编码为输出编码支持的字符进行打印。 UTF-8可以编码所有Unicode字符。

答案 1 :(得分:0)

这是对的。输出时,必须将unicode对象编码为所需的字符编码,即utf-8或其他。将unicode(包括所有u&#34;&#34;文字)视为抽象,必须在序列化之前编码为utf-8

您可以使用unicodes对象utf-8编码为s.encode('utf-8')。 Python 2中的str对象是字节编码的,因此您不会出现类似&#34; \ xd17 \ 81&#34;之类的错误,它们已经被编码。

我建议您使用Python 3而不是Python 2,这样更直观。