在講這個問題之前,我們先說說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上顯示才不會亂:
- 字符串以GBK格式顯示
- 字符串是unicode編碼
為什么在內存中用utf-8會出現亂碼,用unicode就不會呢?原因如下:
utf-8雖然壓縮了存儲空間,但是如果在內存中存儲,使用utf-8卻由於它的長度不固定,帶來了很大的不便,使得在內存處理字符變得復雜。應對這個問題的解決策略是:在內存中存儲字符時還是使用unicode編碼,因為unicode編碼的長度固定,處理起來很方便。而在文件的存儲中,則使用utf-8編碼,可以壓縮內存,節省空間。這里一般有個自動轉換的機制,即從文件中讀取utf-8編碼到內存時,會自動轉換為unicode編碼,而從內存中將字符保存到文件時,則自動轉換為utf-8編碼。
解決辦法就是用decode和 encode
什么是decode和encode:
另外,在python2里unicode是一個單獨的類型。
參考:https://www.cnblogs.com/alex3714/articles/7550940.html