Python2與Python3關于字符串編碼處理的差別總結
0x00 字符的編碼
計算機畢竟是西方國家的發(fā)明,最開始并沒有想到會普及到全世界,只用一個字節(jié)中的7位(ASCII)來表示字符對于現在龐大的文字數量來說顯然不夠,所以先后經歷了好幾套編碼方案,不同國家和地區(qū)又有自己的方案,造成了現在諸多的歷史遺留問題。
0x01 Python中的字符串
Python有兩種不同的字符串,一種存儲文本,一種存儲字節(jié)。對于文本,Python內部采用Unicode存儲,而字節(jié)字符串顯示原始字節(jié)序列或者ASCII。
什么叫編碼(encode)?
按照字面意思和以往經驗,我要把這個文本或字符串用“UTF-8”編碼,感覺上應該是對字節(jié)數據進行編碼然后顯示正確的文字。大多數人都是這么想的,可事實呢?
編碼的意思是將Unicode字符按照編碼規(guī)則(如UTF-8)編成字節(jié)序列:

有人此時會問,我用 print 語句打印出來怎么是亂碼或者是中文,并不是字節(jié)序列。這是因為你調用 print 語句的時候,默認進行了隱式解碼,為的是讓人類看見友好的字符數據 ,也就是默認的進行了str()包裝,想看見背后真正的十六進制數,你需要調用魔術方法 _repr_() 。
什么叫解碼(decode)?
對應的,解碼就是將字節(jié)序列按照編碼規(guī)則(如UTF-8)解釋成unicode形式。

這里或許又會有疑問,編碼解碼都是十六進制,那中文字符咋顯示的?
這又要結合你的環(huán)境了??赐晡疑厦嫱扑]的文章,你就會明白,Unicode只是一種標準,而具體的編碼才是實現方式。有了正確的Unicode編碼,僅僅代表你有了正確的英文文獻,想翻譯成中文,還得再轉換一次。而這一次轉換,是你的環(huán)境幫你完成。舉個例子,你打開一個文檔,發(fā)現是亂碼,多半是文本編輯器的解碼方式有問題,換個解碼規(guī)則就好了。
0x02 Python2 和 Python3 之間的區(qū)別
Python3 一切都很美好
在Python3當中,文本字符串類型(使用Unicode數據存儲)被命名為 str , 字節(jié)字符串類型被命名為 bytes 。一般情況下,實例化一個字符串會得到一個 str 對象 :

所以現在很多人都說,Python3默認是Unicode,也就是這個意思。
如果你想得到bytes,那就在文本之前加上前綴 b , 或者 encode 一下。

所以,很顯然,str 對象有一個encode方法,bytes 對象有一個decode方法。
Python2 相當的操蛋,甚至會誤導你
在Python3中的 str 對象在Python2中叫做 unicode ,感覺很通俗對吧?但 bytes 對象在Python2中叫做 str ,對。。就是你平時用的 str , 默認的那個。。。
如果你想得到一個文本字符串,你需要在字符串之前加上前綴 u 或者 decode 一下。
搞笑的還不止這么點,Python2中的 str (字節(jié)) 對象,竟然有一個 encode 方法!?。《夷銊e指望它有什么特殊用處,它就是用來報錯的,永遠都別使用它?。?!
同樣的,unicode (文本字符) 對象也有一個用來報錯的 decode 方法。
我們嘗試一下:

不知道大家注意到錯誤信息沒有,我們在進行解碼,規(guī)則是GBK,但它說 無法用 ascii 進行編碼 ,這是為什么?
這就是Python2自作聰明為了對一個unicode對象執(zhí)行解碼而進行的隱式編碼 ,等于以下代碼:
b.encode('ascii').decode('GBK')
這就是為什么很多人說,Python2的編碼很操蛋。
0x03 小結
如果你在用2.X,請養(yǎng)成在字符串加上 u 前綴的習慣,統一編碼UTF-8,如果windows控制臺或者Pycharm控制臺依舊出現亂碼,那多半是控制臺編碼不同,改過來就好。
參考書籍 《Python 高級編程》
總結
到此這篇關于Python2與Python3關于字符串編碼處理的差別總結的文章就介紹到這了,更多相關Python2與Python3字符串編碼處理差別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python3中利用filter函數輸出小于某個數的所有回文數實例
今天小編就為大家分享一篇 python3中利用filter函數輸出小于某個數的所有回文數實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
python多進程執(zhí)行方法apply_async使用說明
這篇文章主要介紹了python多進程執(zhí)行方法apply_async使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
AI生成圖片Stable?Diffusion環(huán)境搭建與運行方法
Stable?Diffusion是一種基于擴散過程的生成模型,由Ge?et?al.在2021年提出,該模型利用了隨機變量的穩(wěn)定分布,通過遞歸地應用擴散過程來生成高質量的圖像,這篇文章主要介紹了AI圖片生成Stable?Diffusion環(huán)境搭建與運行,需要的朋友可以參考下2023-05-05

