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