在python3 encode和decode 的使用


說這個問題之前必須的介紹關於編碼的在我們這的發展:

首先電腦能識別的最初的語言是二進制 ---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'>
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM