2016-02-10 55 views
1

我跑python2.7.10與「UTF-8」編碼的Unicode顯示字節串僅適用於非ASCII

試圖總結我的身邊,爲什麼下列行爲被認爲是頭。 (當然有一個合理的解釋)

所以我定義了兩個unicode字符,只有第一個在ascii-set中,第二個在它外面。

>>> a=u'\u0041' 
>>> b=u'\u1234' 
>>> print a 
A 
>>> print b 
ሴ 

現在我編碼它看看相應的字節將是什麼。但只有後者給我的結果,我希望看到(字節)

>>> a.encode('utf-8') 
'A' 
>>> b.encode('utf-8') 
'\xe1\x88\xb4' 

也許,問題是我的期望,如果是這樣,你可以解釋其中的缺陷所在。 - 我的a,b是unicode(內部序號的十六進制值) - 打印這些時,解釋器打印出與每個unicode字節對應的實際字符。 - 當我編碼時,我認爲它會使用我提供的編碼方案(在本例中爲utf-8)轉換爲字節字符串。我期望看到一個字符串爲a.encode,就像我爲b.encode做的一樣。

我錯過了什麼?

回答

4

沒有缺陷。您編碼爲UTF-8,對於Unicode標準的前127個編碼點使用與ASCII標準相同的字節,並對其他所有內容使用多個字節(2到4之間)。

然後,您在終端中回顯該值,該值使用repr()函數構建調試表示形式。該表示爲字符串生成有效的Python表達式,其中一個爲ASCII安全。該值中的任何字節不是可打印的作爲ASCII字符顯示爲轉義序列。因此UTF-8字節顯示爲十六進制轉義的\xhh

最重要的是,因爲A是一個可打印的ASCII字符,它顯示爲is;任何代碼編輯器或終端都將接受ASCII,而對於大多數顯示實際文本的英文文本來說,它更加有用。

請注意,您使用的print存儲在abunicode值,這意味着Python的編碼這些值到終端的編解碼器,你的終端以產生正確的輸出協調。你沒有在口譯員中迴應這些價值觀。假如你這樣做,你也看見過調試輸出:

>>> a = u'\u0041' 
>>> b = u'\u1234' 
>>> a 
u'A' 
>>> b 
u'\u1234' 

在Python 3中,repr()功能的功能性(或者說,object.__repr__鉤)已經更新到生產unicode字符串與大多數可打印碼點沒有逃脫。使用新的ascii()函數來獲得上述行爲。

+0

總體意義。謝謝。有沒有一種方法可以像非打印的那樣爲ascii安全代碼點打印轉義序列\ xhh? – ajaysdesk

+1

@ajaysdesk:你必須手動完成。例如,您可以使用'binascii.hexlify()'函數將所有字節轉換爲十六進制輸出(但不帶'\ x'前綴)。 –

+0

謝謝。正是我想要的 – ajaysdesk

相關問題