繁体   English   中英

在python中,为什么调用字符串“ X”以ASCII显示它,而调用“ print X”以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模式(如果您为ñ获得了不同的表示形式,这是因为您的控制台使用了其他文本表示形式),所以当您按ñ时,实际上是输入了两个字节0xc30xb1

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM