2012-04-23 59 views
8
>>> a = "我" # chinese 
>>> b = unicode(a,"gb2312") 
>>> a.__class__ 
<type 'str'> 
>>> b.__class__ 
<type 'unicode'> # b is unicode 
>>> a 
'\xce\xd2' 
>>> b 
u'\u6211' 

>>> c = u"我" 
>>> c.__class__ 
<type 'unicode'> # c is unicode 
>>> c 
u'\xce\xd2' 

bc都是unicode的,但>>> b輸出u'\u6211'>>> c輸出u'\xce\xd2',爲什麼呢?Unicode和`解碼()`在Python

+0

你使用什麼終端?我無法在我的Unicode gnome終端上重現結果('c === u'\ u6211'') – 2012-04-23 08:53:22

+0

@ChrisMorgan我在IDLE中測試這些代碼。 – 2012-04-23 08:54:34

+0

也可以用IDLE重新編寫 – 2012-04-23 09:00:12

回答

12

當您輸入"我"時,Python解釋器從終端獲取本地字符集中該字符的表示形式,由於"",它以字節爲單位存儲在字節中。在我的UTF-8系統上,這是。在你的,因爲你使用GB2312,所以它是'\xce\xd2'。這解釋了變量a的價值。

當您輸入u"我"時,Python解釋器不知道字符在哪個編碼中。它的作用幾乎與普通字符串相同:它將字符的字節存儲在Unicode字符串中,將每個字節解釋爲Unicode代碼點,因此錯誤的結果u'\xce\xd2'(或者在我的包裝箱上,u'\xe6\x88\x91')。

這個問題只存在於交互式解釋器中。當你編寫Python腳本或模塊時,你可以在頂部附近輸入specify the encoding,並且Unicode字符串將出現正確。例如,我的系統上,下面的打印字Liberté廣場兩次:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

print(u"liberté") 
print("liberté") 
0

的交互式Python顯示對象的表示當你只是類型在其名稱。另一方面,打印命令嘗試渲染字符。您的變量名稱爲a屬於字符串類型。實際上,Python 2.x中的字符串是一系列字節。所以,這取決於你的工作環境。你對unicode()函數說你現在使用gb2312編碼。如果是,則b包含給定編碼中字符的正確表示。

嘗試

>>> print b 
你的情況

。很可能你會看到想要的結果。也嘗試:

>>> print repr(a) 
... 
>>> print repr(b) 

中的表示(如果可能)的文本串,當複製粘貼到源代碼將創建該對象具有相同的值。

查看Mark Pilgrim的「潛入Python 3」第4章字符串(http://getpython3.com/diveintopython3/strings.html)以獲得更好的可讀解釋。