2014-03-19 86 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字符串值的字節串。