关于编码,unicode和stdout的一些基本问题

时间:2014-03-19 14:23:47

标签: python python-2.7 unicode encoding utf-8

说我这样做:

>>> 'é'        #1
'\xc3\xa9'
>>> u'é'       #2
u'\xe9'
>>> print u'é' #3
é

这是我的理解:

  1. 当我将'é'粘贴到我的Python会话中时,就是一个bytearray 包含2个字节以某种方式登陆到stdin,即Python 从中读取。相同的字节将发送到stdout并以十六进制格式显示。
  2. 这次Python必须解码字节:它读取sys.stdin.encoding,找到utf-8,并将2个字节解码为unicode。然后我不确定会发生什么。我们可以向stdout发送一个unicode字符串吗?或者Python可以使用unicode代码点的十六进制表示,在utf-8中对其进行编码并发送到stdout
  3. Python将2个字节解码为unicode。然后print再次在utf-8中对其进行编码,并将结果发送到stdout
  4. 我的理解是否正确?

1 个答案:

答案 0 :(得分:4)

Python交互式解释器回显任何表达式的结果,除非结果是None。回声总是使用repr() function来创建可用的表示。在引擎盖下,对象有一个__repr__ special method,可以完成所有艰苦的工作。

对于字符串,打印的值可以再次直接在Python中用于重新创建字符串,任何不可打印的非ASCII字节都用转义序列表示。例如,换行符变为\né的两个UTF-8字节用\xhh十六进制转义符表示。

因此,对于第1点,Python确实从终端接收了两个字节,将它们存储在字符串中,字符串的表示包含字符',{{1 }},\xc等。如果您将其粘贴回Python,则会再次获得相同的字符串值。

对于2.,您创建了一个Unicode字符串对象。终端发送了两个UTF-8字节,但你现在告诉Python解析一个3字符串文字,它确实是用u'..'解码的。

Unicode字符串对象的表示形式是另一个字符串文字,前缀为sys.stdin.encoding,表示它是Unicode字符串,而不是常规字符串。 U + 0080到U + 00FF(拉丁语1范围)范围内的Unicode代码点由u转义码表示。 \xhhUnicode codepoint U+00E9,因此由é表示。从U + 0100到U + FFFF的代码点使用\xe9表示,因为使用了更高的代码点\uhhhh

同样,您可以复制此表示形式,将其粘贴回Python并再次获得完全相同的值。

\Uhhhhhhhh直接写入print,如果给sys.stdout一个Unicode字符串对象,则在写入之前首先使用print将Unicode字符串值编码为字节串它到sys.stdout.encoding