字符的編碼是按照某種規(guī)則在單字節(jié)字符和多字節(jié)字符之間進(jìn)行轉(zhuǎn)換的某種方法。從單字節(jié)到多字節(jié)叫做decoding,從多字節(jié)到單字節(jié)叫做encoding。在這些規(guī)則中經(jīng)常用到的無(wú)非是UTF-8和GB2312兩種。
在Python中,codecs模塊提供了實(shí)現(xiàn)這些規(guī)則的方法,通過(guò)模塊公開(kāi)的方法我們能夠方便地獲取某種編碼方式的Encoder和Decoder工廠(chǎng)函數(shù)(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter類(lèi)。
使用“import codecs”導(dǎo)入codecs模塊。
codecs模塊中重要的函數(shù)之一是lookup,它只有一個(gè)參數(shù)encoding,指的是編碼方式的名稱(chēng),即utf-8或者gb2312等等。如下示例:
>>> import codecs
>>> t = codecs.lookup("utf-8")
>>> print t
(, , , )
>>> encoder = t[0]
>>> decoder = t[1]
>>> StreamReader = t[2]
>>> StreamWriter = t[3]
lookup函數(shù)返回一個(gè)包含四個(gè)元素的TUPLE,其中t[0]是encoder的函數(shù)引用,t[1]是decoder的函數(shù)引用,t[2]是UTF-8編碼方式的StreamReader類(lèi)對(duì)象引用,t[3]是UTF-8編碼方式的StreamWriter類(lèi)對(duì)象引用相信對(duì)Python熟悉的你肯定知道接下來(lái)該怎么用它們了。
codecs模塊還提供了方便程序員使用的單獨(dú)函數(shù),以簡(jiǎn)化對(duì)lookup的調(diào)用。它們是:
getencoder(encoding)
getdecoder(encoding)
getreader(encoding)
getwriter(encoding)
如果我們只是想獲取一種utf-8編碼的encoder方法,那么只需要這樣做:
>>> encoder = codecs.getencoder("utf-8")
另外,對(duì)于StreamReader和StreamWriter的簡(jiǎn)化,codecs模塊提供一個(gè)open方法。相對(duì)于built-in對(duì)象File的open方法,前者多了三個(gè)參數(shù)encoding, errors, buffering。這三個(gè)參數(shù)都是可選參數(shù),但是對(duì)于應(yīng)用來(lái)說(shuō),需要明確指定encoding的值,而errors和buffering使用默認(rèn)值即可。使用方法如下:
>>> fin = codecs.open("e:\\mycomputer.txt", "r", "utf-8")
>>> print fin.readline()
這是我的電腦
>>> fin.close()
總結(jié)一下,codecs模塊為我們解決的字符編碼的處理提供了lookup方法,它接受一個(gè)字符編碼名稱(chēng)的參數(shù),并返回指定字符編碼對(duì)應(yīng)的encoder、decoder、StreamReader和StreamWriter的函數(shù)對(duì)象和類(lèi)對(duì)象的引用。為了簡(jiǎn)化對(duì)lookup方法的調(diào)用,codecs還提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和getwriter(encoding)方法;進(jìn)一步,簡(jiǎn)化對(duì)特定字符編碼的StreamReader、StreamWriter和StreamReaderWriter的訪(fǎng)問(wèn),codecs更直接地提供了open方法,通過(guò)encoding參數(shù)傳遞字符編碼名稱(chēng),即可獲得對(duì)encoder和decoder的雙向服務(wù)。

