python:字元編碼與轉碼
字元編碼與轉碼
詳細文章:
http://www.cnblogs.com/yuanchenqi/articles/5956943.html
http://www.diveintopython3.net/strings.html
需知:
1.在python2預設編碼是ASCII, python3裡預設是unicode
2.unicode 分為 utf-32(佔4個位元組),utf-16(佔兩個位元組),utf-8(佔1-4個位元組), so utf-16就是現在最常用的unicode版本, 不過在檔案裡存的還是utf-8,因為utf8省空間
3.在py3中encode,在轉碼的同時還會把string 變成bytes型別,decode在解碼的同時還會把bytes變回string
上圖僅適用於py2
in python3
#-*-coding:gb2312 -*- #這個也可以去掉 __author__ = 'Alex Li' import sys print(sys.getdefaultencoding()) msg = "我愛北京天安門" #msg_gb2312 = msg.decode("utf-8").encode("gb2312") msg_gb2312 = msg.encode("gb2312") #預設就是unicode,不用再decode,喜大普奔 gb2312_to_unicode = msg_gb2312.decode("gb2312") gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8") print(msg) print(msg_gb2312) print(gb2312_to_unicode) print(gb2312_to_utf8)
import sys print(sys.getdefaultencoding()) msg="我愛北京天安門" s="分割線" msg_gb2312=msg.encode("gb2312") gb2312_to_unicode=msg_gb2312.decode("gb2312") gb2312_to_utf8=msg_gb2312.decode("gb2312").encode("utf-8") print(msg) print("gb2312:",msg_gb2312) print("unicode:",gb2312_to_unicode) print("utf-8:",gb2312_to_utf8) print("\n%s\n"%(s.center(80,"*"))) msg_gbk=msg.encode("gbk") gbk_to_unicode=msg_gbk.decode("gbk") gbk_to_utf8=msg_gbk.decode("gbk").encode("utf-8") print("gbk:",msg_gbk) print("unicode:",gbk_to_unicode) print("utf-8:",gb2312_to_utf8) print(gb2312_to_utf8.decode("utf-8"))
檢視Python系統編碼
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'
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編碼型別。