说我这样做:
>>> 'é' #1
'\xc3\xa9'
>>> u'é' #2
u'\xe9'
>>> print u'é' #3
é
这是我的理解:
'é'
粘贴到我的Python会话中时,就是一个bytearray
包含2个字节以某种方式登陆到stdin
,即Python
从中读取。相同的字节将发送到stdout
并以十六进制格式显示。sys.stdin.encoding
,找到utf-8
,并将2个字节解码为unicode。然后我不确定会发生什么。我们可以向stdout
发送一个unicode字符串吗?或者Python可以使用unicode代码点的十六进制表示,在utf-8
中对其进行编码并发送到stdout
?print
再次在utf-8
中对其进行编码,并将结果发送到stdout
。 我的理解是否正确?
答案 0 :(得分:4)
Python交互式解释器回显任何表达式的结果,除非结果是None
。回声总是使用repr()
function来创建可用的表示。在引擎盖下,对象有一个__repr__
special method,可以完成所有艰苦的工作。
对于字符串,打印的值可以再次直接在Python中用于重新创建字符串,任何不可打印的非ASCII字节都用转义序列表示。例如,换行符变为\n
,é
的两个UTF-8字节用\xhh
十六进制转义符表示。
因此,对于第1点,Python确实从终端接收了两个字节,将它们存储在字符串中,字符串的表示包含字符'
,{{1 }},\
,x
,c
等。如果您将其粘贴回Python,则会再次获得相同的字符串值。
对于2.,您创建了一个Unicode字符串对象。终端发送了两个UTF-8字节,但你现在告诉Python解析一个3
字符串文字,它确实是用u'..'
解码的。
Unicode字符串对象的表示形式是另一个字符串文字,前缀为sys.stdin.encoding
,表示它是Unicode字符串,而不是常规字符串。 U + 0080到U + 00FF(拉丁语1范围)范围内的Unicode代码点由u
转义码表示。 \xhh
为Unicode codepoint U+00E9,因此由é
表示。从U + 0100到U + FFFF的代码点使用\xe9
表示,因为使用了更高的代码点\uhhhh
。
同样,您可以复制此表示形式,将其粘贴回Python并再次获得完全相同的值。
\Uhhhhhhhh
直接写入print
,如果给sys.stdout
一个Unicode字符串对象,则在写入之前首先使用print
将Unicode字符串值编码为字节串它到sys.stdout.encoding
。