python3與python2的編碼問題


在講這個問題之前,我們先說說unicode的工作原理。unicode包含了跟全球所有國家編碼的映射關系,就是不管你用哪個國家的編碼,unicode都能找到它在unicode中的編碼。那么無論你用什么編碼儲存數據,只要這台電腦的系統支持unicode,那么你把數據放到內存里讀,系統就會用unicode把你的編碼解出來。現在所有的系統和編程語言都默認支持unicode。

下圖是unicode的關系映射,其包含了跟全球所有國家編碼的關系映射:

 utf-8是unicode的一種優化,utf-8在英文占1個字節、歐洲語系占2個、東亞占3個,其它及特殊字符占4個。值得注意的是:utf-8在進行內存儲存時還是用的unicode編碼,在文件儲存中用的才是utf-8編碼。原因如下:

 

下面進入正題:

phython3默認編碼是utf-8, 內存里(也就是字符串) 是編碼是unicode,即使聲明了某種編碼,在內存里還是unicode。

python2文件默認編碼是ASCII,字符串默認也是ASCII,但是如果文件頭聲明了某種編碼,那字符串編碼就是那個編碼。但是python2有一個問題,就是如果你想寫中文,你的文件頭聲明了utf-8,python2的解釋器會用你聲明的編碼去給你解碼,加載到內存后也是用utf-8給你解碼,而不是unicode!這就意味着,你用windows(中文版windwos默認編碼是gbk)去執行的話就會出現亂碼。因為在windows上只有2種情況 ,你的windows上顯示才不會亂:

  1. 字符串以GBK格式顯示
  2. 字符串是unicode編碼

為什么在內存中用utf-8會出現亂碼,用unicode就不會呢?原因如下:

utf-8雖然壓縮了存儲空間,但是如果在內存中存儲,使用utf-8卻由於它的長度不固定,帶來了很大的不便,使得在內存處理字符變得復雜。應對這個問題的解決策略是:在內存中存儲字符時還是使用unicode編碼,因為unicode編碼的長度固定,處理起來很方便。而在文件的存儲中,則使用utf-8編碼,可以壓縮內存,節省空間。這里一般有個自動轉換的機制,即從文件中讀取utf-8編碼到內存時,會自動轉換為unicode編碼,而從內存中將字符保存到文件時,則自動轉換為utf-8編碼。

 

解決辦法就是用decode和 encode

什么是decode和encode:

字符串在Python內部的表示是Unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
decode的作用是將其他編碼的字符轉換成unicode編碼,如str1,decode('gb2312'),表示將gb2312編碼的字符串str1轉換成unicode編碼。
encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2,encode('gb2312'),表示將unicode編碼的字符串str2轉換成gb2312編碼。
 
因此,轉碼的時候一定要明白,字符串str是什么編碼,然后decode成unicode編碼,然后再encode成其他編碼。

另外,在python2里unicode是一個單獨的類型。

參考:https://www.cnblogs.com/alex3714/articles/7550940.html

 

 

 

 

 


免責聲明!

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



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