2014-03-19 46 views
0

几个基本的问题说我这样做:约编码,Unicode和标准输出

>>> 'é'  #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。然后我不确定会发生什么。我们可以发送一个unicode字符串到stdout吗?或者,也许Python采用unicode代码点的十六进制表示,将其编码为utf-8并发送至stdout
  3. Python将2个字节解码为unicode。然后print再次编码utf-8并将结果发送到stdout

我的理解是否正确?

回答

4

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

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

因此,点1,Python中确实收到两个字节从终端,存储在那些一个字符串,该字符串的表示由字符'\xc3等。如果你把它粘贴回Python,你会再次获得相同的字符串值。

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

Unicode字符串对象的表示形式是另一个字符串字面值,前缀为u,以显示它是Unicode字符串,而不是常规字符串。 U + 0080到U + 00FF(Latin 1范围)范围内的Unicode码点由\xhh转义码表示。 éUnicode codepoint U+00E9,所以用\xe9表示。从U + 0100到U + FFFF的代码点使用\uhhhh表示,对于更高的代码点\Uhhhhhhhh被使用。

再一次,你可以复制这个表示,把它粘贴回Python,并再次得到完全相同的值。

print直接写入sys.stdout,如果你给print Unicode字符串对象,将使用sys.stdout.encoding其写入sys.stdout之前先编码Unicode字符串值的字节串。