1. 程式人生 > >Python 編碼解碼的問題(學習筆記+總結思考)

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碼
檢視python預設編碼的方法
附:切換預設編碼的方法
這裡寫圖片描述
所以在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型別進行編碼,
而假如指定了和原型別不同的編碼就會出現亂碼

預設#encoding: utf-8
這裡寫圖片描述

四、檢驗編碼的工具–chardet

import chardet
chardet.detect(串)
通常只有只有str串可檢測到編碼方案

五、python3

python3 區分了 unicode str 和 byte arrary,並且預設編碼不再是 ascii, 為utf-8

import sys
sys.getdefaultencoding()
# 可檢視Python3的預設編碼。​