1. 程式人生 > >python2.7 編碼問題整理

python2.7 編碼問題整理

tro 編碼方式 這樣的 創建 不同 表示 ice 文本 logs

本文轉自:http://www.cnblogs.com/fnng/p/5008884.html。

不能不說,蟲師的blog文章質量非常值得借鑒,通篇讀下來,解決了許多的問題。

鑒於良好的收藏習慣,轉載到此。以後有什麽自己的體會,也可以直接修改編輯。

-------------------------------------------------------------------------------------------

0. 認識常見編碼

  GB2312是中國規定的漢字編碼,也可以說是簡體中文的字符集編碼

  GBK 是 GB2312的擴展 ,除了兼容GB2312外,它還能顯示繁體中文,還有日文的假名

  cp936:中文本地系統是Windows中的cmd,默認codepage是CP936,cp936就是指系統裏第936號編碼格式,即GB2312的編碼。

    (當然有其它編碼格式:cp950 繁體中文、cp932 日語、cp1250 中歐語言。。。)

  Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。UTF-8、UTF-16、UTF-32都是將數字轉換到程序數據的編碼方案。

  UTF-8 (8-bit Unicode Transformation Format)是最流行的一種對 Unicode 進行傳播和存儲的編碼方式。它用不同的 bytes 來表示每一個代碼點。ASCII 字符每個只需要用一個 byte ,與 ASCII 的編碼是一樣的。所以說 ASCII 是 UTF-8 的一個子集。

在開發Python程序的過程中,會涉及到三個方面的編碼:

  • Python程序文件的編碼
  • Python程序運行時環境(IDE)的編碼
  • Python程序讀取外部文件、網頁的編碼

Python程序文件的編碼

例如:

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 使用百度前必讀 意見反饋 ICP030173

  Windows cmd 用的是cp936,也就是中文的GB2312,在GBK的字符集裏沒有“?”,這就導致通過GBK解析的時候出現編碼問題。

  這就像你在翻譯英文的時候,出現了一個單詞,這個單詞你查遍了牛津大詞典都沒找到對應的含義解釋,那麽自然是會有問題的。

  那假設,我還就想在cmd下執行這個python程序了,那麽可以去修改cmd的默認編碼類型為utf-8,對應的編碼為CHCP 65001utf-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 的作用是將其他編碼的字符串轉換成 Unicode 編碼,eg name.decode(GB2312),表示將GB2312編碼的字符串name轉換成Unicode編碼。
  • encode 的作用是將Unicode編碼轉換成其他編碼的字符串,eg name.encode(GB2312),表示將GB2312編碼的字符串name轉換成GB2312編碼。

  例如,前面獲取百度底部信息的例子。我還可以通過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編碼類型。

python2.7 編碼問題整理