說這個問題之前必須的介紹關於編碼的在我們這的發展:
首先電腦能識別的最初的語言是二進制 ---010101這種
然后在是我們知道的ASSIC碼
再過了就是 gb2312----------->gbk1.0--------->最后是gbk18030
最后國際上為了統一編制了 Unicode 但是Unicode有三個版本Unicode‘UTF——32’, 每個字符都是4個字節,一個字節8bety,但美國人民有點不願意,隨后
改編成了Unicode‘UTF——16’每個字符都是兩個字節,最后改編成現在的Unicode“UTF-8”在這里面,英文用的ASSIC碼一個字節(美國人民應該很高興),然后歐洲的一些語言字符是兩個字節,一個中文就是三個字節
介紹完歷史,接下來就講講為么子要encode 和decode:最根本的原因還是各個編碼只能上級包容下級,下級想讀取上級就會出現亂碼(簡單的說就是Unicode能識別gbk,而gbk想直接Unicode就會亂碼,Unicode是向下包容的)
在Python2里面(估計現在不怎么用的吧): 默認識別是ASCLL碼,所以不能識別中文。而現在國內的windows默認支持識別應該是gbk
在python2中的中文想要Windows識別就得通過 聲明“#!_*_ coding :UTF-8 _*_ ” 源碼格式為UTF-8,這樣就可以識別輸入的中文,但是python2想要在window上表現出來就必須通過編碼為gbk格式才行這里就可以這樣:方法一(感覺這方法是個雞肋,方法二靠譜些):(假定已經聲明是UTF-8) s =‘中文巴拉巴拉 ’
s_to_Unicode=s.decode("Unicode") 將‘中文巴拉巴拉’轉為Unicode格式 這時候 再將 , s_to_Unicode =s.encode('gbk') 這會兒window就能識別s了print就不會出錯了這里要解釋兩點內容: 為什么要先解碼再編碼而不直接編碼;還有假如encode 和decode后面不寫格式會怎樣(內容太多我畫了個圖)
s_to_Unicode=s.decode("Unicode") 但是由於Unicode是向下兼容gbk的所以這里的print(s_to_Unicode)也能被windows是被顯示成和s_to_Unicode =s.encode('gbk')一樣的中文,但是他們的內部排序和占的內存都不相同不同這里就不深究了;這里補充解釋一下為何不見gbk直接解碼成utf-8,原因是你省了一步解碼 成Unicode的過程,但是電腦不會省,所以說如果直接解碼為utf-8會報錯 其內部默認的過程是將gbk格式先解碼為python2默認的ASCLL碼再編碼為UTF-8這肯定會亂的撒
方法二:直接聲明“#!_*_ coding :gbk _*_ ”:這樣print(s)window就能識別了
在python3 里面 :python3的默認文件編碼是UTF-8 但是(重點)所有的字符都是Unicode格式,所以 s =‘中文巴拉巴拉 ’ 可以被windows識別,如果你非要編碼為gbk格式 這里輸出的將不會是 ‘中文巴拉巴拉 ’,因為在python3里面特殊字符(即中文)編碼會將其轉換為另一種格式即byte字節類型,而byte類型只能識別英文等非特殊字符,所以在s =‘ i love 中文巴拉巴拉 ’編碼為gbk時就能print(s)出 i love 中文巴拉巴拉 這里得到的byte類型是以gbk編碼的byte類型,要轉回Unicode就得解碼gbk,與byte無關。python3在解碼時會把byte類型轉換成字符串
補充:byte類型相當於[0--255]之間的純數字類型 在文件處理時:不同機器之間進行傳輸就必須用到這種類型
以下是我測試后的代碼

1 a = 'hello 酷狗' #str類型》》》》Unicode 2 3 #編碼 str >>>>>bytes 4 b = bytes(a,'utf8') 5 print(b,type(b)) #b'hello \xe9\x85\xb7\xe7\x8b\x97' <class 'bytes'> 6 b1 = bytes(a,'gbk') 7 print(b1,type(b1)) #b'hello \xbf\xe1\xb9\xb7' <class 'bytes'> 8 9 c = a.encode('utf8') 10 print(c,type(c)) #b'hello \xe9\x85\xb7\xe7\x8b\x97' <class 'bytes'> 11 c1 = a.encode('gbk') 12 print(c1,type(c1)) b'hello \xbf\xe1\xb9\xb7' <class 'bytes'> 13 14 15 #解碼 bytes>>>>>str 16 d = str(b,'utf8') 17 print(d,type(d)) #hello 酷狗 <class 'str'> 18 d1 = str(b,'gbk') 19 print(d1,type(d1)) #hello 閰風嫍 <class 'str'> 20 21 d2 = str(b1,'gbk') 22 print(d2,type(d1)) #hello 酷狗 <class 'str'> 23 24 e = b.decode('utf8') 25 print(e,type(e)) #hello 酷狗 <class 'str'> 26 e2 = b1.decode('gbk') 27 print(e2,type(e2)) #hello 酷狗 <class 'str'>