Python 編碼解碼的問題(學習筆記+總結思考)
*幾個問題:
1.# coding: utf-8與sys.setdefaultencoding(‘utf-8’)的區別?
2.假如檔案頭 沒有#coding: utf-8那麼檔案當前的編碼是什麼?
3.print是相當於讀入麼?print出來的結果的編碼跟什麼有關?
這幾個問題會在看完以下知識後進行解答
一、基本概念:
1.位元組:
位元組是計算機中資料儲存的基本單位,一位元組等於一個8位的位元,計算機中的所有資料,不論是儲存在磁碟檔案上的還是網路上的傳輸資料(文字、圖片、視訊、音訊檔案)都是由位元組組成的.
2.字元:
一個字元就是一個資訊單位,是各種符號和文字的統稱(例如’A’和”漢字”)
3.字符集:
某範圍內字元的集合,不同的字符集規定了字元的個數,比如ASCII字符集總共有128個字元
而GB2312字符集定義了7445個字元,包含了絕大部分的漢字字元
4.字元碼:
字符集中每個字元的數字編號,例如ASCII字符集用0-127連續的128個數字分別表示128個字元,例如”A”的字元碼編號是65.(字元碼形如01000001)
5.字元編碼(此處編碼為名詞概念):
將字符集中的字元碼對映為位元組流的一種具體實現方案(比如把0100000101000010劃分為01000001.01000010的方案)
字符集與字元編碼有種對應關係,例如ASCII字符集對應ASCII編碼
6.編碼encode、解碼decode(此處編碼為動詞概念):
通常來說:讀入檔案需要decode一下,寫入檔案需要encode一下
編碼的過程:字元->位元組流(計算機處理的是位元組流不是字元,故而編碼,是以特定的方式把字元變成位元組流)
解碼的過程:位元組流->字元()
二、字元編碼:(按演進順序)
1.ASCII碼(->EASCII碼)
2.(GB2312碼)GBK碼(收錄了少數民族文字) 是中國人自己創造的,解決了所有漢字的編碼問題
3.Unicode編碼 它為世界上每一種語言的每一個字元定義了一個唯一的字元碼(16進位制數字表示兩位元組或者四位元組編碼)
Unicode的侷限:有時候會浪費空間; 在各個編碼規則面前作用像英語
4.UTF-8 它是Unicode的一種實現方式,它是一種變長的字元編碼
三、Python中的編碼問題
Python的預設編碼是ASCII碼
附:切換預設編碼的方法
所以在Python2中,原始碼的檔案必須顯示指定編碼型別,程式碼中出現中文就會報錯
#coding=utf-8
或者是
# -*- coding:utf-8
python2中字串相關的型別有str和unicode兩種型別
str型別的字串的編碼格式可以是ASCII、utf-8、gbk等任何一種
str(採用某種編碼的字串)–decode—>unicode串
unicode串–encode—>str(採用某種編碼的字串)
在python2中預設是用ascii碼進行encode,decode操作
假如
s=’你好’
s.decode()
預設為ascii編碼進行解碼,但是ascii字符集中沒有中文符
所以應該s.decode(‘utf-8’)
*回答幾個問題:
1.# coding: utf-8與sys.setdefaultencoding(‘utf-8’)的區別?
# coding: utf-8是設定檔案的字元的編碼為’utf-8’,假如不這麼設定那py檔案中出現中文ide將無法識別其為什麼字元更加無法對其操作;而sys.setdefaultencoding(‘utf-8’)是設定系統的預設編碼方案,即預設以’utf-8’的編碼方案讀入和寫出檔案
2.假如檔案頭 沒有#coding: utf-8那麼檔案當前的編碼是什麼?
ascii編碼方案 因為這是python直譯器預設的;
python內部使用的字串的型別為unicode型別
3.print是相當於讀入麼?print出來的結果的編碼跟什麼有關?
print 也是要將unicode串 encode 成有特定編碼的位元組流,所以與寫入操作的規則類似
假如print的物件是unicode型別即使是中文也不會出現亂碼,因為編譯器會自動對unicode型別進行編碼,
而假如指定了和原型別不同的編碼就會出現亂碼
四、檢驗編碼的工具–chardet
import chardet
chardet.detect(串)
通常只有只有str串可檢測到編碼方案
五、python3
python3 區分了 unicode str 和 byte arrary,並且預設編碼不再是 ascii, 為utf-8
import sys
sys.getdefaultencoding()
# 可檢視Python3的預設編碼。