1. 程式人生 > >python中string和Unicode的區別

python中string和Unicode的區別

首先要弄清楚的是,在python裡,string object和unicode object是兩種不同的型別。

string object是由characters組成的sequence,而unicode object是Unicode code units組成的sequence。

string裡的character是有多種編碼方式的,比如單位元組的ASCII,雙位元組的GB2312等等,再比如UTF-8。很明顯要想解讀string,必需知道string裡的character是用哪種編碼方式,然後才能進行。

Unicode code unit又是什麼東西呢?一個Unicode code unit是一個16-bit或者32-bit的數值,每個數值代表一個unicode符號。在python裡,16-bit的unicode,對應的是ucs2編碼。32-bit對應的是ucs4編碼。是不是感覺string裡character的編碼沒什麼區別?反正我現在腦子裡就是這樣一個印象:在Python裡,ucs2或者ucs4編碼的,我們叫做unicode object,其他編碼的我們就叫做string。


至於python裡的unicode到底是ucs2還是ucs4的,可以在編譯時指定。例如Linux下,要用ucs2做unicode的編碼,可以這樣
# ./configure --enable-unicode=ucs2 
# make
# make install
下載的Windows預編譯版本,一般都是ucs2的。要想知道某個python執行環境是ucs2還是ucs4,可以檢視sys.maxunicde,65535就是ucs2的,另一個很大的數值就是ucs4。

下面我們看看string和unicode在python裡的不同
我們先看看在簡體中文Windows 2003系統下,系統編碼是GBK
>>> a = '你好'

>>> a
'/xc4/xe3/xba/xc3'
>>> b = u'你好'
>>> b
u'/u4f60/u597d'
>>> print a
你好
>>> print b
你好
>>> a.__class__
<type 'str'>
>>> b.__class__
<type 'unicode'>
>>> len(a)
4
>>> len(b)
2

在一個系統編碼為UTF-8的Linux環境下
>>> a = '你好'
>>> a

'/xe4/xbd/xa0/xe5/xa5/xbd'
>>> b = u'你好'
>>> b
u'/u4f60/u597d'
>>> print a
你好
>>> print b
你好
>>> a.__class__
<type 'str'>
>>> b.__class__
<type 'unicode'>
>>> len(a)
6
>>> len(b)
2

如何?簡單總結一下:
1、string直接用引號來表示,unicode在引號前加一個u
2、直接輸入的string常量會用系統預設編碼方式來編碼,例如在GBK環境下,'你好'會編碼成'/xc4/xe3/xba/xc3',而在UTF-8環境下就成了'/xe4/xbd/xa0/xe5/xa5/xbd'。
3、len(string)返回string的位元組數,len(unicode)返回的是字元數
4、很重要的一點,print unicode不會亂碼。現在我們常用的Linux、Windows系統,都是支援unicode的,版本太老的不算。比如Windows 2003支援ucs2,所以在中文Windows2003下,除了可以正常顯示預設的GBK編碼外,還可以正常顯示ucs2編碼。舉個例子,還是在中文Windows 2003的GBK環境下:
>>>a = '/xe4/xbd/xa0/xe5/xa5/xbd' # UTF-8的'你好'
>>> print a
浣犲ソ
>>> b = unicode(a, "UTF-8")
>>> b
u'/u4f60/u597d'
>>> print b
你好

應該明白了吧?

下面再說說string和unicode的相互轉換,什麼unicode()、decode()、encode()、codecs之類的。