![](/img/trans.png)
[英]Why does Python 2.x throw an exception with string formatting + unicode?
[英]In python, why does calling a string, “X”, display it in ASCII, but calling “print X” display it in unicode?
我有一个字符串列表,类似于list=[a,b,c,d,e]
。
当我调用list[2]
,字符串c
显示为ASCII; 但是,当我调用print list[2]
时,它显示为unicode。 为什么存在这种差异?
这主要是因为Python 2中的字符串不是文本字符串,而是字节字符串 。
我想您处于REPL环境(Python控制台)中。 在控制台中评估某些内容时,将获得其打印表示形式 ,与在表达式上调用print repr()
相同:
l = ['ñ']
l[0] # should output '\xc3\xb1'
print repr(l[0]) # should output the same
这是因为您的控制台处于UTF-8模式(如果您为ñ
获得了不同的表示形式,这是因为您的控制台使用了其他文本表示形式),所以当您按ñ
时,实际上是输入了两个字节0xc3
和0xb1
。
repr()
是始终返回字符串的Python方法。 对于基本类型,此字符串是重建作为参数传递的值的有效来源。 在这种情况下,它将返回带有字节序列的字符串,该字符串将重新创建另一个带有ñ
编码为UTF-8的字符串。 要看到这个:
repr(l[0]) # should print a string within a string: "'\\xc3\\xb1'"
因此,当您打印它时(与在控制台中进行评估相同),您将得到相同的字符串,而没有用引号引起来,并且转义字符被正确替换。 即:
print repr(l[0]) # should output '\xc3\xb1'
但是,当您打印该值时,即: print l[0]
,然后将这两个字节发送到控制台。 由于控制台处于UTF-8模式,它将对序列进行解码并将其转换为仅一个字符: ñ
。 所以:
print l[0] # should output ñ
如果要存储文本字符串,则必须在字符串之前使用修饰符u
。 这条路:
text = u'ñ'
现在,在评估文本时,您将看到其Unicode代码点 :
text # should output u'\xf1'
并打印它应重新创建ñ
字形:
print text # should output `ñ`
如果要将text
转换为字节字符串表示形式,则需要一种编码方案(例如UTF-8):
text.encode('utf-8') == l[0] # should output True
同样,您需要l[0]
的Unicode表示,您需要解码这些字节:
l[0].decode('utf-8') == text # should output True
所有这些,在Python 3中请注意,默认字符串的确是Unicode字符串,您需要在文字符号前加上b
才能生成字节字符串。
这是因为这两种显示字符串的方法使用不同的路由来获得最终结果。 REPL中的x
本身将调用repr(x)
并显示它,但是print(x)
将调用str(x)
并显示它。 允许类分别定义__repr__
和__str__
,因此它们并不总是返回相同的值。
>>> x = u"a"
>>> x
u'a'
>>> print x
a
>>> repr(x)
"u'a'"
>>> str(x)
'a'
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.