在python中,为什么调用字符串“X”以ASCII格式显示它,而调用“print X”以unicode格式显示它?

2024-03-29 06:35:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串列表,沿着list=[a,b,c,d,e]行。你知道吗

当我调用list[2]时,字符串c显示为ASCII;然而,当我调用print list[2]时,它显示为unicode。为什么会存在这种差异?你知道吗


Tags: 字符串列表asciiunicode差异listprint
2条回答

这主要是因为python2中的字符串不是文本字符串,而是字节字符串。你知道吗

我假设您在REPL环境(Python控制台)中。当您在控制台中计算某个内容时,会得到它的打印表示形式,这与在表达式上调用print repr()相同:

l = ['ñ']
l[0] # should output '\xc3\xb1'
print repr(l[0]) # should output the same

这是因为您的控制台处于UTF-8模式(如果您得到不同的ñ表示,这是因为您的控制台使用其他一些文本表示),所以当您按ñ时,实际上输入了两个字节0xc30xb1。你知道吗

^{}是一个始终返回字符串的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'ñ'

现在,在计算文本时,您将看到its Unicode codepoint

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

注意,在python3中,默认字符串实际上是Unicode字符串,您需要在文字表示法前面加上b来生成字节字符串。你知道吗

这是因为这两种显示字符串的方式使用不同的路径来获得最终结果。^REPL中的{}将调用repr(x)并显示它,但是print(x)将调用str(x)并显示它。类可以分别定义__repr____str__,因此它们并不总是返回相同的值。你知道吗

>>> x = u"a"
>>> x
u'a'
>>> print x
a
>>> repr(x)
"u'a'"
>>> str(x)
'a'
>>>

相关问题 更多 >