1. 程式人生 > >python:字元編碼與轉碼

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編碼型別。