Python2.x使用過程中,中文亂碼解決最耳熟能詳?shù)姆椒ň褪窃诖a前加上#-*- coding:utf-8 –*-
那么為什么需要這么做呢?什么又是字節(jié)和字符?下面我們了解下。
我來講一下字符問題我的理解吧,雖然我對Python的編碼處理的具體細(xì)節(jié)還不太清楚,不過臨時稍微看了一下,和Perl的原理也差不多
最重要的是必須區(qū)分“字符”和“字節(jié)”的不同,“字符”是抽象的,而“字節(jié)”是具體的
比如一個“中”字,在不同編碼中用如下字節(jié)表示:
GBK Big5 UTF-8 UTF-16LE
/xD6/xD0 /xA4/xA4 /xE4/xB8/xAD /x2D/x4E
所謂“抽象”的“字符”的“中”,并不是指“/xD6/xD0”或“/xA4/xA4”或任何字節(jié),應(yīng)該把它理解成:GBK編碼中“/xD6/xD0”字節(jié)所指代的那個字符(語言學(xué)中的能指→所指),或者UTF-8編碼中“/xE4/xB8/xAD”所指代的那個字符,但并不是這些具體字節(jié)本身
問題是,抽象的字符要作為數(shù)據(jù)進(jìn)行存儲和傳遞,就必須有具體的形式,也就是說你在程序內(nèi)部實現(xiàn)中,要存儲“中”這個字符,你必須采用某些特定的字節(jié)。你可以用“/xD6/xD0”,也可以用“/xE4/xB8/xAD”,也可以用“/x2D/x4E”,Python在Windows下采用的是UTF-16LE(?),也就意味著它的“字符”的載體編碼是UTF-16LE
sys.setdefaultencoding(name) Set the current default string encoding used by the Unicode implementation.
文檔上是這么寫的,如果我的理解沒錯的話,這個函數(shù)的作用就是改變“字符”的載體編碼,sys.setdefaultencoding('gbk')以后,“中”這個字符在程序內(nèi)部就不是用“/x2D/x4E”來承載,而是用“/xD6/xD0”來承載了
Python2.x里的str和unicode有什么區(qū)別呢?從字面意義上看容易混淆,實際上,你可以把它理解成str是“字節(jié)串”,unicode是“字符串”(string總是翻譯成“字符串”,在這里就很容易把人繞暈),看下面的例子:
# -*- coding: gb2312 -*- s = "張三李四" print len(s) #=> 8 u = s.decode('gbk') print len(u) #=> 4 我的腳本編碼用的是GBK,而不是UTF-8,你會看到len(s)是8,這是這四個漢字所用的實際8個“字節(jié)”,而len(u)是4,這就表示這里有4個“字符”
encode和decode是什么意思呢?所謂編碼,就是把意義轉(zhuǎn)換成符號;而解碼,就是把符號還原成意義。在這里,encode應(yīng)該理解成把抽象的字符轉(zhuǎn)換成具體的字節(jié),而decode是把具體的字節(jié)還原成抽象的字符
現(xiàn)在的問題是:str類和unicode類都同時具有encode和decode方法,這是一個讓我很不以為然的設(shè)定。如果按照字節(jié)與字符的區(qū)分,encode方法是應(yīng)該只歸unicode類所有,decode方法是只歸str類所有的,因為“意義”只能轉(zhuǎn)換成“符號”,“意義”再還原成“意義”這本身就沒有意義。
新聞熱點
疑難解答