問題發現
在學習socket編程時,遇到這樣一個報錯,意思是需要一個位元組流的物件,而不是str,
a bytes-like object is required, not 'str'
我們知道在網路傳輸中,資料是以二進制的方式進行傳輸的,報這個錯大概就是你這個東西不是二進制,而是“文本”,我不能進行傳輸,
解決方案也很簡單,只需要在傳輸的資訊后面加上.decode("..."),就可以使用某種編碼方式進行傳輸了,
當時越想越蒙,Python里的“文本”是什么格式,Python2和Python3貌似是什么不同來著,感覺自己的基本功太欠缺,編碼方面的事情沒有搞懂,
Python2和Python3
在網上的資料中,Python2的字串有兩種型別:str和unicode,str是屬于位元組流型別,默認的編碼方式是ascii,所以Python2中腳本第二行,一般會寫上用utf-8編碼,否則中文及其它一些符號是不能顯示的,
到了Python3字串就只有unicode型別了,unicode是什么?
Unicode(中文:萬國碼、國際碼、統一碼、單一碼)是計算機科學領域里的一項業界標準,它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字,-來自維基百科
可以這樣理解,unicode是一個非常大的表格,它對世界上的字符都進行了編碼,每個字符都有自己的代號,可以查看這個鏈接,是中文的unicode編碼,
那utf-8又是什么?首先unicode編碼只是對字符進行了編碼,比如令的編碼是4EE4,但它并沒有說這個字存盤時怎么存,utf-8的意義就是規定了它的存盤方式,再比如令存盤為\xe4\xbb\xa4,具體可以查看utf-8是以什么規則進行存盤的,
在Python3中,編碼方式就是utf-8了,我們的代碼,文本檔案操作時會以這種編碼方式,
審視問題
回過頭來看一下這個問題,我們就知道是怎么回事了,比如我們想傳輸一句話:你好,世界,這在Python中是以unicode方式進行存盤,這樣當然不能通過網路傳輸了,所以需要s.encode('utf8'),當然不寫utf8,也是默認使用的utf8,這樣我們的話就可以順著網線傳輸過去,對方接收時,也用utf8進行解碼就可以,即.decode('utf8'),如果我們發送的是純英文,使用ascii編碼就可以完成傳輸和接收的任務,
總結
到這里基本上就大致討論完Python的編碼方式了,在Windows和Linux上還有一些不同,所以最好顯示指定編碼方式和解碼方式,
總而言之,一個unicode編碼的字符有encode方法,你可以把它用任何格式進行編碼;一個二進制型別的資料,你可以使用decode方法,通過相應的解碼方式,去看到它的字符含義,
參考鏈接
字符編碼筆記:ASCII,Unicode 和 UTF-8
Python 編碼為什么那么蛋疼?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/171903.html
標籤:Python
