一、 編碼相關概念
1、 ASCII
計算機內部都是由二進制值,字符集就是用一種對應關係來表示二進制與字符的映射關係。一個字節有8個bit,2**8就可以表示256個符號,當時,20世紀60年代,美國只用低7位制定了128個字符的ASCII字符集。
2、 非ASCII
Ø 從128到255被稱爲擴展ASCII字符集,不是國際標準。
Ø 中文的數字量大用雙字節(DBCS:double-byte character set)的方式進行表示,gb2312—gbk—gb18030
gb2313: 高字節 0xA1-0xF7 低字節 0xA1-0xFE
gbk: 高字節 0xA1-0xF7 低字節 0x00-0xFE
3、 Unicode
Ø 爲了統一這種情況,將世界的所有符號都納入其中,每個符號都有獨一無二的編碼,這就是Unicode。
Ø 由2個字節組成(UCS-2),後續擴展到4個字節(UCS-4)
Ø UTF-8和Unicode 的關係:UTF-8是 Unicode 的實現方式之一,用於傳輸和存儲(節省空間)。
Ø 在傳輸、存儲使用UTF-8變長的,在內存中使用unicode固定長的。
Ø 中文unicode編碼表:http://www.chi2ko.com/tool/CJK.htm
Ø UTF-8編碼規則:
1) 對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的 Unicode 碼。因此對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。
2) 對於n字節的符號(n > 1),第一個字節的前n位都設爲1,第n + 1位設爲0,後面字節的前兩位一律設爲10。剩下的沒有提及的二進制位,全部爲這個符號的 Unicode 碼。
Unicode符號範圍 | UTF-8編碼方式
(十六進制) | (二進制)
----------------------+---------------------------
0000 0000-0000007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx10xxxxxx
0000 0800-0000 FFFF | 1110xxxx10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx10xxxxxx 10xxxxxx 10xxxxxx
舉個栗子:
比如:張的unicode5F20 對應的二進制101111100100000
格式:1110xxxx10xxxxxx 10xxxxxx
二進制:101111100100000
UTF-8:11100101 10111100 10100000
二、 python中的編碼
1、 python2
Ø python2默認的編碼字符集是ASCII
Ø python2中有兩種字符序列的類型:str(字符串)和unicode(Unicode字符)
Ø 編碼:unicode.encode() -> bytes(str)
解碼:Bytes.decode -> unicode
2、 文件編碼
why:
需要對文件進行編碼然後由python解釋器執行
how:
指定方式:文件頭# coding=<encoding name>
-*- coding: <encodingname> -*-
vim: setfileencoding=<encoding name> :
3、 python解析器/分詞器的工作邏輯:
Ø 讀取文件
Ø 不同的文件,根據其聲明的編碼去解析爲Unicode
Ø 轉換爲UTF-8字符串
Ø 針對UTF-8字符串,去分詞
Ø 編譯之,創建Unicode對象
摘自:https://www.python.org/dev/peps/pep-0263/
4、 指定系統默認編碼(默認是ACSII)
why:
s = '中文' # 注意這裏的 str 是 str 類型的,而不是 unicode
s.encode(“utf-8”)
Python 會自動的先將 s 解碼爲 unicode ,然後再編碼成 gb18030。因爲解碼是python自動進行的,我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。很多情況下sys.defaultencoding 是 ASCII,如果 s 不是這個類型就會出錯。我的 sys.defaultencoding 是 anscii,而 s 的編碼方式和文件的編碼方式一致,是 utf8 的,所以出錯了:
等價於 s.decode(“acsii”).encode(“utf-8”)
改成s.decode(“utf-8”).encode(“utf-8”)
how:
在文件頭加入以下代碼:
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding(“utf-8”)
or
在Lib\site-packages文件夾下新建一個sitecustomize.py,內容爲:
#encoding=utf8
importsys
reload(sys)
sys.setdefaultencoding('utf8')