Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python打印无法同时打印Unicode和字符串_Python_Unicode - Fatal编程技术网

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

Python打印无法同时打印Unicode和字符串,python,unicode,Python,Unicode,下面是我观察到的几个案例。我想知道为什么Python的打印会出现这种情况,以及可能的修复方法 >>> print "%s" % u"abc" # works >>> print "%s" % "\xd1\x81" # works >>> print "%s %s" % (u"abc", "\xd1\x81") # Error 对于上面(最后一个),我得到:UnicodeDecodeError:'ascii'编解码器无法解码位置0处的字节0x

下面是我观察到的几个案例。我想知道为什么Python的打印会出现这种情况,以及可能的修复方法

>>> print "%s" % u"abc" # works
>>> print "%s" % "\xd1\x81" # works
>>> print "%s %s" % (u"abc", "\xd1\x81") # Error
对于上面(最后一个),我得到:
UnicodeDecodeError:'ascii'编解码器无法解码位置0处的字节0xd1:序号不在范围(128)

但是,这是有效的

>>> print "%s %s" % ("abc", "\xd17\x81") # works
当我这么做的时候

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

其引发的UnicodeEncodeError:“charmap”编解码器无法对位置4:字符映射到的字符u'\u0441'进行编码这是正确的。输出时,必须将unicode对象编码为所需的字符编码,即
utf-8
或其他任何形式。将
unicode
(包括所有u”字面值)视为一种抽象,在序列化之前必须编码为类似于
utf-8

您可以使用
s.encode('utf-8')
unicode
对象
s
编码为
utf-8
str对象是字节编码的,因此不会出现类似“\xd17\81”之类的错误,因为它们已经编码


我建议您使用Python3而不是Python2,因为这更直观。

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

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

因此:

事实上:

>>> print unicode("%s",'ascii') % u"abc" # and valid
print unicode("%s %s",'ascii') % (u"abc", unicode("\xd1\x81",'ascii'))
但是,只有当您的意思是“不抛出错误”时,以下内容才有效。如果希望它打印U+0441个字符,则仅当输出编码为UTF-8时才会这样做。它在我的Windows系统上打印垃圾

>>> print "%s" % "\xd1\x81"
以下给出了由于隐式Unicode解码导致的错误:

print "%s %s" % (u"abc", "\xd1\x81")
这实际上是:

>>> print unicode("%s",'ascii') % u"abc" # and valid
print unicode("%s %s",'ascii') % (u"abc", unicode("\xd1\x81",'ascii'))
\xd1
0x81
不在0-7Fh的ASCII范围内

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

您应该强调:“不要混合使用Unicode和ByTestRing”