我之前老是有這種感覺, 就是明明已經看過很多關於字符編碼的資料了, 感覺字符編碼相關的知識點不難理解, 覺得自己已經把字符編碼給弄懂了, 但當別人問我到底什么是字符編碼, Unicode是什么啊, UTF-8又是什么的時候, 我又結結巴巴的說不清楚, 或者只能給個含糊不清的回答, 老是把相關的知識點給弄混. 所以這篇博客, 就是要把字符編碼給真正的搞懂, 把相關的知識點梳理清楚.
到底什么是字! 符! 編! 碼?!!!
我們所理解的"字符編碼(名詞)"包含兩個部分:
1.字符集
2.編碼規則
字符集, 做了什么事情呢? 其實就是給一個字符指定一個數字編號,
就像我們每個人都會有一個身份證號一樣, 通過一個身份證號可以對應某一個人,
那我們通過數字編號, 就可以對應到某個具體的字符了
所以, 簡單來說, 字符集就相當於一個大的數據庫, 這個數據庫中包含了兩個字段(列): 字符, 和字符對應的編號
+------+----------+
| 字符 | 編號 |
+------+----------+
| a | 97 |
+------+----------+
| b | 98 |
+------+----------+
編碼規則, 就是如何對"字符的編號"進行編碼的一種規則, 比如我們現在要將字母 "a" 保存到硬盤中,
"a"對應的編號是97, 所以我們只要保存97就行了, 按照ASCII的編碼規則, 使用8位二進制數(第1位二進制為0)來進行編碼,
97在經過編碼后的存儲格式就為01100001
為什么要有字符編碼?
歸根結底, 計算機只認識0和1(二進制), 不是0和1的數字, 我們可以通過位數轉換, 轉換成二進制
那對於字符, 計算機要怎么識別呢?
將每個字符都指定一個數字編號(字符集), 再將數字編號轉為二進制(編碼規則), 這樣計算機就能識別了
Unicode與UTF-8
首先, Unicode也是包含兩個部分: 字符集+編碼規則
你可以將Unicode字符集理解為是包含了全世界大多數語言字符與字符編號的超大數據庫
而UTF-8就是Unicode的一種編碼規則, 除了UTF-8, 還有UTF-16、UTF-32等編碼規則
UTF-32: 不管你的編號是多少, 即使是1, 我都給你轉為用32位的二進制: 00000000 00000000 00000000 00000001
UTF-16: 能轉為16位就轉為16位, 16位不夠就轉為32位
UTF-8: 能轉為8位就轉8位, 8位不夠就轉16位, 16位不夠就轉24位, 24位不夠轉32位
Python2和Python3中的字符編碼
python2默認字符編碼是ASCII, 當你用python2的解釋器去運行你寫好的py2代碼(硬盤中),
解釋器會用ASCII的編碼規則去讀取, 由於ACSII編碼不支持中文,
所以我們一般在py2代碼首行: #encoding: utf-8來指定字符編碼規則為utf-8
python3默認的字符編碼是Unicode, 當你用python3的解釋器去執行你寫好的py3代碼(硬盤中),
解釋器會用UTF-8編碼規則來讀取
Python2和Python3中的字符串
python2中的字符串的str和unicode類型
name = "bigb" (就是py3中的bytes類型)
name = u"bigb" (就是py3中的str類型)
python3中的字符串的str和bytes類型
name = "bigb"
name = b"bigb"
注:
只是對相關概念做了簡單闡述, 目的是理清字符編碼的相關知識點, 如果對字符編碼有深入了解的需求, 請自行查閱相關資料