Python基礎之七:編碼詳解

晴朗_不積跬步無以至千里發表於2020-10-23

Python基礎之七:編碼詳解

在編寫python程式的過程中,中英文混用經常會出現編碼問題。為了更深入的理解此問題,特編寫此文,加強自己對編碼的認知。

編碼即是密碼本,編碼記錄的就是二進位制與文字之間的對應關係

一、編碼的分類

1、ASCII編碼

ASCII ((American Standard Code for Information Interchange): 美國資訊交換標準程式碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。它是最通用的資訊交換標準,並等同於國際標準ISO/IEC 646。ASCII第一次以規範標準的型別發表是在1967年,最後一次更新則是在1986年,到目前為止共定義了128個字元 。

包含:數字、英文字母、特殊字元

對應關係:a對應:0110 0001

單個字元大小:一個字元表示一個位元組

2、GBK編碼

GBK全稱《漢字內碼擴充套件規範》(GBK即“國標”、“擴充套件”漢語拼音的第一個字母,英文名稱:Chinese Internal Code Specification) ,中華人民共和國全國資訊科技標準化技術委員會1995年12月1日製訂,國家技術監督局標準化司、電子工業部科技與質量監督司1995年12月15日聯合以技監標函1995 229號檔案的形式,將它確定為技術規範指導性檔案。這一版的GBK規範為1.0版。

包含:中國文字、相容ASCII編碼(英文字母、數字、特殊字元)

對應關係:
a 對應: 0110 0001
中 對應:01001001 01000010

單個字元大小:
英文字母、數字、特殊字元:一個字元表示一個位元組
中文:一個字元兩個位元組

3、unicode編碼

Unicode是一個編碼方案,Unicode 是為了解決傳統的字元編碼方案的侷限而產生的,它為每種語言中的每個字元設定了統一併且唯一的二進位制編碼,以滿足跨語言、跨平臺進行文字轉換、處理的要求。Unicode 編碼共有三種具體實現,分別為utf-8,utf-16,utf-32,其中utf-8佔用一到四個位元組,utf-16佔用二或四個位元組,utf-32佔用四個位元組。Unicode 碼在全球範圍的資訊交換領域均有廣泛的應用。

包含:全世界所有的文字

對應關係:
a 對應: 01000001 01000010 01000011 00000001
中 對應:01001001 01000010 01100011 00000001

單個字元大小:不定,Unicode 編碼共有三種具體實現,分別為utf-8,utf-16,utf-32,其中utf-8佔用一到四個位元組,utf-16佔用二或四個位元組,utf-32佔用四個位元組。

4、UTF-8編碼

UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是針對Unicode的一種可變長度字元編碼。它可以用來表示Unicode標準中的任何字元,而且其編碼中的第一個位元組仍與ASCII相容,使得原來處理ASCII字元的軟體無須或只進行少部份修改後,便可繼續使用。因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字的應用中,優先採用的編碼。

包含:全世界所有的文字

對應關係:
a 對應: 0110 0001
To 對應:01000001 01000010
中 對應:01001001 01000010 01100011

單個字元大小:
英文字母、數字、特殊字元:一個字元表示一個位元組
歐洲文字:葡萄牙,西班牙等:一個字元兩個位元組表示
中文:一個字元三個位元組表示

二、資料在計算機中的儲存和傳輸

1、在計算機記憶體中,統一使用Unicode編碼,當需要將資料儲存到硬碟或者需要網路傳輸的時候,就轉換為非Unicode編碼

在這裡插入圖片描述

2、不同編碼之間,不能直接互相識別

unicode編碼的資料是不可以用於網路傳輸和儲存到磁碟的:
在這裡插入圖片描述
解決以上問題:
在這裡插入圖片描述

3、不同編碼之間,間接識別

因為存世上的所有的編碼都和Unicode編碼有關係,所以需要藉助Unicode編碼進行轉換。
在這裡插入圖片描述

4、bytes資料型別

在Python3以後,字串和bytes型別徹底分開了。字串是以字元為單位進行處理的,bytes型別是以位元組為單位處理的。

bytes資料型別在所有的操作和使用內建方法上和字串資料型別基本一樣,也是不可變的序列物件。

bytes物件只負責以二進位制位元組序列的形式記錄所需記錄的物件,至於該物件到底表示什麼(比如到底是什麼字元)則由相應的編碼格式解碼所決定。

Python3中,bytes通常用於網路資料傳輸、二進位制圖片和檔案的儲存等等。

可以通過呼叫bytes()生成bytes例項,其值形式為 b’xxxxx’,其中 ‘xxxxx’ 為一至多個轉義的十六進位制字串(單個 x 的形式為:\x12,其中\x為小寫的十六進位制轉義字元,12為二位十六進位制數)組成的序列,每個十六進位制數代表一個位元組(八位二進位制數,取值範圍0-255),對於同一個字串如果採用不同的編碼方式生成bytes物件,就會形成不同的值。

建立方式:

a = b''         # 建立一個空的bytes
b = bytes()      # 建立一個空的bytes
c = b'hello'    #  直接指定這個hello是bytes型別

str和bytes之間的轉換:

a = bytes('晴朗', encoding='utf-8')  #利用內建bytes方法,將字串轉換為指定編碼的bytes
print(a)#b'\xe6\x99\xb4\xe6\x9c\x97'

b = str.encode('晴朗')   # 利用字串的encode方法編碼成bytes,預設為utf-8型別
print(b)#b'\xe6\x99\xb4\xe6\x9c\x97'

c = bytes.decode(b'\xe6\x99\xb4\xe6\x9c\x97') #將bytes物件解碼成字串,預設使用utf-8進行解碼。
print(c)

相關文章