2016-10-03 192 views
0
>>> c='中文' 
>>> c 
'\xe4\xb8\xad\xe6\x96\x87' 
>>> len(c) 
6 
>>> cu=u'中文' 
>>> cu 
u'\u4e2d\u6587' 
>>> len(cu) 
2 
>>> s='' 
>>> s 
'\xf0\xa4\xad\xa2' 
>>> len(s) 
4 
>>> su=u'' 
>>> su 
u'\U00024b62' 
>>> len(su) 
2 
>>> import sys 
>>> sys.getdefaultencoding() 
'ascii' 
>>> sys.stdout.encoding 
'UTF-8' 

首先,我想使自己的一些概念清晰。 我知道,像cu=u'中文'這樣的unicode字符串,實際上是由python shell默認的UTF-16編碼的。對? 那麼,當我們看到'\u*'時,那實際上是UTF-16 encoding?而'\u4e2d\u6587'是一個unicode字符串或字節字符串?cu必須存儲在內存中,所以len(unicode字符串)

0100 1110 0010 1101 0110 0101 1000 0111 

(轉換\ u4e2d \ u6587二進制)是形式cu如果一個字節的字符串保存? 對嗎?

但它不能是字節串。否則len(cu)不能是2,應該是4! 所以它必須是unicode字符串。 但是!!!我也learned

蟒蛇試圖暗中編碼與任何 方案中sys.stdout.encoding當前設置的Unicode字符串,在這種情況下它的 「UTF-8」。

>>> cu.encode('utf-8') 
'\xe4\xb8\xad\xe6\x96\x87' 

所以!怎麼可能len(cu) == 2 ???那是因爲裏面有兩個'\u'嗎?

但是,這並沒有使len(su) == 2感覺!

我錯過了什麼嗎?

我使用python 2.7.12

+0

個字符! =字節。一個utf16字符是2個字節,但只有一個字符。 –

+0

您想了解有關Unicode * *的信息*。見http://nedbatchelder.com/text/unipain.html –

+0

@MartijnPieters謝謝!這是非常有幫助 – MMMMMCCLXXVII

回答

0

Python的unicode類型包含Unicode代碼點,並不意味着是一個編碼。 Python如何在內部執行此操作是實現細節,而不是大部分時間需要關注的內容。它們不是UTF-16代碼單元,因爲UTF-16是另一種可用於編碼Unicode文本的編解碼器,就像UTF-8一樣。

這裏最重要的是,標準的Python str對象持有字節,這可能會或可能不會保留編碼到一定的編解碼器文本(你的樣品使用UTF-8,但是這不是一個給定的),和unicode持有Unicode碼點。在交互式解釋器會話中,終端的編解碼器確定Python收到哪些字節(然後在您創建對象時使用sys.stdin.encoding解碼這些字節)。

只有當書面sys.stdout(比方說,使用print時)完成了sys.stdout.encoding值前來遊玩,其中Python會自動重新編碼的Unicode字符串。只有然後將您的2個Unicode碼位再次編碼爲UTF-8並寫入終端,該終端知道如何解釋這些碼位。

你可能想讀了關於Python和Unicode,我建議:

+0

提出另一個問題。正如你所提到的,只有在使用'print'時,python會再次自動編碼unicode字符串。所以bash shell會在收到它時再次解碼爲unicode,以便在屏幕上顯示並使用該unicode來匹配所謂的渲染或我不確定的東西,或者將其留給字形。所以,我能否簡單地認爲,如果我想在屏幕上顯示某些內容,Unicode是最後一種形式?呃,你能明白我的觀點嗎? – MMMMMCCLXXVII