認識常見編碼python
GB2312是中國規定的漢字編碼,也能夠說是簡體中文的字符集編碼web
GBK 是 GB2312的擴展 ,除了兼容GB2312外,它還能顯示繁體中文,還有日文的假名windows
cp936:中文本地系統是Windows中的cmd,默認codepage是CP936,cp936就是指系統裏第936號編碼格式,即GB2312的編碼。編輯器
(固然有其它編碼格式:cp950 繁體中文、cp932 日語、cp1250 中歐語言。。。)ide
Unicode是國際組織制定的能夠容納世界上全部文字和符號的字符編碼方案。UTF-八、UTF-1六、UTF-32都是將數字轉換到程序數據的編碼方案。字體
UTF-8 (8-bit Unicode Transformation Format)是最流行的一種對 Unicode 進行傳播和存儲的編碼方式。它用不一樣的 bytes 來表示每個代碼點。ASCII 字符每一個只須要用一個 byte ,與 ASCII 的編碼是同樣的。因此說 ASCII 是 UTF-8 的一個子集。編碼
在開發Python程序的過程當中,會涉及到三個方面的編碼:spa
Python程序文件的編碼翻譯
例如:code
Python2自帶的IDE,當建立了一個文件保存的時候提示:
這是由於Python2編輯器默認的編碼是ASCII,它是沒法識別中文的,因此會彈出這樣的提示。這也是咱們在大多狀況下寫python2程序的時候習慣在程序的第一行加上:#coding=utf-8
其實,這裏的編碼文件是很容易解決的。
Python程序運行時環境(IDE)的編碼
執行下面的一段程序。
#coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.get("http://www.baidu.com") # 返回百度頁面底部備案信息 text = driver.find_element_by_id("cp").text print(text) driver.close()
在windows cmd下執行:
咱們要獲取的信息是:
©2015 Baidu 使用百度前必讀 意見反饋 京ICP證030173號
Windows cmd 用的是cp936,也就是中文的GB2312,在GBK的字符集裏沒有「©」,這就致使經過GBK解析的時候出現編碼問題。
這就像你在翻譯英文的時候,出現了一個單詞,這個單詞你查遍了牛津大詞典都沒找到對應的含義解釋,那麼天然是會有問題的。
那假設,我還就想在cmd下執行這個python程序了,那麼能夠去修改cmd的默認編碼類型爲utf-8,對應的編碼爲CHCP 65001(utf-8)。在cmd 下輸入:chcp 65001 命令回車。
而後,修改cmd的字體爲「Lucida Console」,再來執行程序就能夠被正確輸出了。
Python程序讀取外部文件、網頁的編碼
#這一塊,暫時沒有找到合適的例子
查看Python系統編碼
查看Python2 或Python3的系統編碼。
Python2:
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> import sys >>> sys.getdefaultencoding() 'ascii'
Python3:
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information. >>> import sys >>> sys.getdefaultencoding() 'utf-8'
那麼如何修改Python2的系統編碼爲urf-8呢?
import sys reload(sys) sys.setdefaultencoding('utf-8')
因此,在你的程序執行的過程當中,遇到下面的報錯信息時。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1....
能夠將上面的三行代碼加到Python程序的頭部。
decode()與encode()
例如,前面獲取百度底部信息的例子。我還能夠經過decode()與encode()來解決:
#coding=utf-8 from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") # 返回百度頁面底部備案信息 text = driver.find_element_by_id("cp").text text2 = text.encode("gbk","ignore").decode("gbk") print(text2)
這裏經過encode()將Unicode編碼轉換成gbk編碼,在轉換的過程當中經過「ignore」忽略掉gbk不能識別的字符(©),而後再把gbk轉換成Unicode編碼。固然,這並非一種完美的方式,畢竟犧牲部分字符串。
chardet模塊
chardet是一個很是優秀的編碼識別模塊。
經過pip 安裝:
>pip install chardet
使用:
>>> from chardet import detect >>> a = "中文" >>> detect(a) {'confidence': 0.682639754276994, 'encoding': 'KOI8-R'}
大概有68%的把握爲KOI8-R編碼類型。