先看代碼
>>> a = '中文' >>> a '中文' >>> print(a) 中文 >>> b = 'English' >>> b 'English' >>> print(b) English
解釋編碼和解碼的過程
>>> aa = a.encode('utf-8') >>> aa b'\xe4\xb8\xad\xe6\x96\x87' >>> a.encode('gbk') b'\xd6\xd0\xce\xc4' >>> aa.decode('utf-8') '中文' >>> type(a) <class 'str'> >>> type(aa) <class 'bytes'> >>> '\u4e2d\u6587 ''中文' >>> print('\u4e2d\u6587') 中文 >>> b.encode('ascii') b'English' >>> b.encode('utf-8') b'English' >>> b.encode('gbk') b'English'
1.編碼與解碼
首先要知道python3中涉及到編碼與解碼的主要只有兩個方法:編碼encode和解碼decode
編碼(encode)過程是將Unicode形式轉化為utf-8等其他形式
解碼(decode)過程是將utf-8等其他形式轉化為Unicode形式
這里一定一定要注意,要把Unicode和utf-8等其他形式區分來看待,Unicode自己是一類,其他形式合在一起是一類
Unicode形式的字符串的type是str,utf-8等其他形式的字符串的type是bytes
可以理解成Uincode就是我們看到的字符本身,utf-8等其他形式是存儲進文件時的格式
Unicode形式的字符串用print打印出來就是我們看到的字符,其他格式print都是一些16進制數
在python3中不涉及與文件、網頁交互時,不涉及到編碼解碼,也不會涉及到亂碼之類的問題,上面展示的只供學習使用(而python2是涉及的,因此很多人會說棄用py2改用py3就沒有編碼問題了,說的就是這里)
python3中a = '中文'這樣賦值默認a的編碼方式是Unicode,encode之后得到的aa是二進制格式(二進制和16進制本質上是一樣的)
編碼和解碼過程是這樣的:比如一串字符,最初以GBK編碼格式存在文件中,我們想將其變成UTF-8編碼。需要先用GBK編碼將原始的二進制數翻譯成字符,即由GBK編碼向Unicode編碼進行轉換,這是解碼過程;得到字符之后再去找這些字符在UTF-8編碼下對應什么二進制數,這些二進制數就是我們要的結果,這是編碼過程,由Unicode向UTF-8編碼的轉換。所以Unicode相當於一個中介,所有編碼的相互轉化都要經過它。
編碼(encode)過程是將Unicode形式轉化為utf-8等其他形式
解碼(decode)過程是將utf-8等其他形式轉化為Unicode形式
這里一定一定要注意,要把Unicode和utf-8等其他形式區分來看待,Unicode自己是一類,其他形式合在一起是一類
Unicode形式的字符串的type是str,utf-8等其他形式的字符串的type是bytes
可以理解成Uincode就是我們看到的字符本身,utf-8等其他形式是存儲進文件時的格式
Unicode形式的字符串用print打印出來就是我們看到的字符,其他格式print都是一些16進制數
在python3中不涉及與文件、網頁交互時,不涉及到編碼解碼,也不會涉及到亂碼之類的問題,上面展示的只供學習使用(而python2是涉及的,因此很多人會說棄用py2改用py3就沒有編碼問題了,說的就是這里)
python3中a = '中文'這樣賦值默認a的編碼方式是Unicode,encode之后得到的aa是二進制格式(二進制和16進制本質上是一樣的)
編碼和解碼過程是這樣的:比如一串字符,最初以GBK編碼格式存在文件中,我們想將其變成UTF-8編碼。需要先用GBK編碼將原始的二進制數翻譯成字符,即由GBK編碼向Unicode編碼進行轉換,這是解碼過程;得到字符之后再去找這些字符在UTF-8編碼下對應什么二進制數,這些二進制數就是我們要的結果,這是編碼過程,由Unicode向UTF-8編碼的轉換。所以Unicode相當於一個中介,所有編碼的相互轉化都要經過它。
2.編碼的形式解讀
首先要熟悉python中出現的編碼形式,有時可以根據它的形式來判斷這是什么編碼
'\u4e2d\u6587'就是中文二字對應的Unicode編碼
b'\xe4\xb8\xad\xe6\x96\x87'就是中文二字對應的utf-8編碼
b'\xd6\xd0\xce\xc4'就是中文二字對應的gbk編碼
'\u4e2d\u6587'就是中文二字對應的Unicode編碼
b'\xe4\xb8\xad\xe6\x96\x87'就是中文二字對應的utf-8編碼
b'\xd6\xd0\xce\xc4'就是中文二字對應的gbk編碼
其中\u和\x都是轉義字符,和\n換行符類似
\x表示十六進制數,每個\x后面跟兩位,每一位都是0-9abcdef這16個中的一個。兩位共可以表示16*16=256個數,即可以表示2^8=2568位的二進制數可以表示的數。也就是說一個\x可以代表一個字節
\u表示Unicode編碼,一個\u后面接4位的16進制數,每一位也是0-9abcdef這16個中的一個,4位可以表示16位二進制數可以表示的數,所以說一個\u可以代表兩個字節
從字節的角度我們再來看一下這個輸出,“中文”兩個字
在Unicode編碼中占4個字節
在utf-8編碼中占6個字節
在gbk編碼中占4個字節
這個結果和我們之前所說的一個中文字符在各個編碼中占字節數相符
\x表示十六進制數,每個\x后面跟兩位,每一位都是0-9abcdef這16個中的一個。兩位共可以表示16*16=256個數,即可以表示2^8=2568位的二進制數可以表示的數。也就是說一個\x可以代表一個字節
\u表示Unicode編碼,一個\u后面接4位的16進制數,每一位也是0-9abcdef這16個中的一個,4位可以表示16位二進制數可以表示的數,所以說一個\u可以代表兩個字節
從字節的角度我們再來看一下這個輸出,“中文”兩個字
在Unicode編碼中占4個字節
在utf-8編碼中占6個字節
在gbk編碼中占4個字節
這個結果和我們之前所說的一個中文字符在各個編碼中占字節數相符
再注意到'\u4e2d\u6587'直接輸出和print都會出現“中文”二字,進一步說明python3中我們通常說的字符其實就是Unicode,將他們看成完全一樣的就好
輸出'\u4e2d\u6587'這種轉義字符時,是識別了\u,自動通過對照表將后面的那串字節顯示成了中文
對於b''這種前面有個b的,type都變了,不是str而是bytes,這種在print時會原樣輸出
輸出'\u4e2d\u6587'這種轉義字符時,是識別了\u,自動通過對照表將后面的那串字節顯示成了中文
對於b''這種前面有個b的,type都變了,不是str而是bytes,這種在print時會原樣輸出