2024-03-29 06:35:40 发布
网友
我有一个字符串列表,沿着list=[a,b,c,d,e]行。你知道吗
list=[a,b,c,d,e]
当我调用list[2]时,字符串c显示为ASCII;然而,当我调用print list[2]时,它显示为unicode。为什么会存在这种差异?你知道吗
list[2]
c
print list[2]
这主要是因为python2中的字符串不是文本字符串,而是字节字符串。你知道吗
我假设您在REPL环境(Python控制台)中。当您在控制台中计算某个内容时,会得到它的打印表示形式,这与在表达式上调用print repr()相同:
print repr()
l = ['ñ'] l[0] # should output '\xc3\xb1' print repr(l[0]) # should output the same
这是因为您的控制台处于UTF-8模式(如果您得到不同的ñ表示,这是因为您的控制台使用其他一些文本表示),所以当您按ñ时,实际上输入了两个字节0xc3和0xb1。你知道吗
ñ
0xc3
0xb1
^{}是一个始终返回字符串的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]
print l[0] # should output ñ
如果要存储文本字符串,必须在字符串前面使用修饰符u。这样:
u
text = u'ñ'
现在,在计算文本时,您将看到its Unicode codepoint:
text # should output u'\xf1'
打印时应重新创建ñ字形:
print text # should output `ñ`
如果要将text转换为字节字符串表示,则需要编码方案(如UTF-8):
text
text.encode('utf-8') == l[0] # should output True
同样,如果您想要l[0]的Unicode表示,则需要对这些字节进行解码:
l[0]
l[0].decode('utf-8') == text # should output True
注意,在python3中,默认字符串实际上是Unicode字符串,您需要在文字表示法前面加上b来生成字节字符串。你知道吗
b
这是因为这两种显示字符串的方式使用不同的路径来获得最终结果。^REPL中的{}将调用repr(x)并显示它,但是print(x)将调用str(x)并显示它。类可以分别定义__repr__和__str__,因此它们并不总是返回相同的值。你知道吗
repr(x)
print(x)
str(x)
__repr__
__str__
>>> x = u"a" >>> x u'a' >>> print x a >>> repr(x) "u'a'" >>> str(x) 'a' >>>
这主要是因为python2中的字符串不是文本字符串,而是字节字符串。你知道吗
我假设您在REPL环境(Python控制台)中。当您在控制台中计算某个内容时,会得到它的打印表示形式,这与在表达式上调用
print repr()
相同:这是因为您的控制台处于UTF-8模式(如果您得到不同的
ñ
表示,这是因为您的控制台使用其他一些文本表示),所以当您按ñ
时,实际上输入了两个字节0xc3
和0xb1
。你知道吗^{} 是一个始终返回字符串的Python方法。对于基元类型,此字符串是重建作为参数传递的值的有效源。在本例中,它返回一个包含字节序列的字符串,该字符串重新创建另一个
ñ
编码为UTF-8的字符串。要看到这一点:因此,当您打印它时(这与在控制台中进行求值相同),您将得到相同的字符串,但没有正确替换外引号和转义字符。即:
但是,当您打印值时,即:
print l[0]
,然后将这两个字节发送到控制台。由于控制台处于UTF-8模式,它对序列进行解码并将其转换为一个字符:ñ
。所以:如果要存储文本字符串,必须在字符串前面使用修饰符
u
。这样:现在,在计算文本时,您将看到its Unicode codepoint:
打印时应重新创建
ñ
字形:如果要将
text
转换为字节字符串表示,则需要编码方案(如UTF-8):同样,如果您想要
l[0]
的Unicode表示,则需要对这些字节进行解码:注意,在python3中,默认字符串实际上是Unicode字符串,您需要在文字表示法前面加上
b
来生成字节字符串。你知道吗这是因为这两种显示字符串的方式使用不同的路径来获得最终结果。^REPL中的{}将调用
repr(x)
并显示它,但是print(x)
将调用str(x)
并显示它。类可以分别定义__repr__
和__str__
,因此它们并不总是返回相同的值。你知道吗相关问题 更多 >
编程相关推荐