python之編碼

一、     編碼相關概念

1、        ASCII

計算機內部都是由二進制值,字符集就是用一種對應關係來表示二進制與字符的映射關係。一個字節有8個bit,2**8就可以表示256個符號,當時,20世紀60年代,美國只用低7位制定了128個字符的ASCII字符集。

 

2、        非ASCII

Ø  從128到255被稱爲擴展ASCII字符集,不是國際標準。

Ø  中文的數字量大用雙字節DBCSdouble-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') 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章