为什么在 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。为什么会存在这种差异?
这是因为这两种显示字符串的方式使用不同的路径到达最终结果。 x
本身在 REPL 中将调用 repr(x)
并显示它,但 print(x)
将调用 str(x)
并显示它。 类 可以分别定义 __repr__
和 __str__
,因此它们并不总是 return 相同的值。
>>> x = u"a"
>>> x
u'a'
>>> print x
a
>>> repr(x)
"u'a'"
>>> str(x)
'a'
>>>
这主要是因为Python2中的字符串不是文本字符串而是字节字符串.
我假设您处于 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 方法,它总是 returns 一个字符串。对于基本类型,此字符串是重建作为参数传递的值的有效来源。在这种情况下,它 returns 一个带有字节序列的字符串,它重新创建另一个字符串 ñ
编码为 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
综上所述,注意 Python 3,默认字符串确实是 Unicode 字符串,您需要在文字符号前加上 b
前缀才能生成字节字符串。
我有一个字符串列表,按照 list=[a,b,c,d,e]
。
当我调用list[2]
时,字符串c
显示为ASCII;但是,当我调用 print list[2]
时,它显示为 unicode。为什么会存在这种差异?
这是因为这两种显示字符串的方式使用不同的路径到达最终结果。 x
本身在 REPL 中将调用 repr(x)
并显示它,但 print(x)
将调用 str(x)
并显示它。 类 可以分别定义 __repr__
和 __str__
,因此它们并不总是 return 相同的值。
>>> x = u"a"
>>> x
u'a'
>>> print x
a
>>> repr(x)
"u'a'"
>>> str(x)
'a'
>>>
这主要是因为Python2中的字符串不是文本字符串而是字节字符串.
我假设您处于 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 方法,它总是 returns 一个字符串。对于基本类型,此字符串是重建作为参数传递的值的有效来源。在这种情况下,它 returns 一个带有字节序列的字符串,它重新创建另一个字符串 ñ
编码为 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
综上所述,注意 Python 3,默认字符串确实是 Unicode 字符串,您需要在文字符号前加上 b
前缀才能生成字节字符串。