python3中的编码与解码
首先,為什么要編碼?
我們知道,計算機只能存儲二進制串001100011....
如果要計算機存儲一個數字7,計算機可以用00000111來表示
如果要存儲'a'這個字符呢?肯定也用一個二進制串來表示字符a
這就是字符的編碼,即將字符轉化成二進制串的過程
那么相反的過程就是解碼,即將二進制串轉化為字符的過程
上面說到,用一個二進制串來表示字符a,那么具體用多少來表示a呢?
如果用01100001來表示字符a,這種映射方式就叫做ASIIC編碼格式
ASIIC格式規定用一個字節來表示一個字符,也就是,最多之能表示256個字符
那么中文字符以及其他語言咋辦呢?
unicode是另外一種編碼方式,它規定最少用兩個字節表示字符,也就是最少能表示65536個字符
這下,全世界語言是都能表示了
但是它在表示英文字母的時候也用兩個字節,高字節都是00000000,顯然很是浪費
于是出現了utf-8編碼格式
它是對unicode的優化,對不同的情況進行了分類
如果是英文字母及常規符號用一個字節表示,中文字符用三個字節表示
可以發現,utf-8編碼相對unicode編碼在全是英文字符的情況下需要的二進制串可以減半
因此,在網絡上傳輸或者文件存儲的時候,都是用utf-8編碼
?
?
python3中的str和bytes兩種數據類型
python中的解碼與編碼分別由decode和encode兩個模塊實現
python(或者任何編程語言)中的編碼如果沒有指定編碼格式的話,默認用的是unicode
因為任何運行在內存中的數據都是以unicode的方式編碼的
此時如果對某個字符調用編碼方法
則會返回該字符按照該編碼格式對應的二進制結果,一般用十六進制顯示
比如我在python中定義了變量a='a'
此時字符'a'在內存中是00000000 01010001,即0x61
執行a.encode()
返回值即是0x61
但對它進行unicode編碼是沒有意義的,為什么?
因為內存中本來存儲的就是按照unicode編碼的二進制串呀,這次編碼操作只是為了用戶查看它的編碼結果而已
一般我們對一個字符編碼無非是為了存儲或者傳輸
而前面我們也了解了,unicode編碼并不是存儲和傳輸的最佳方式
一般我們會用utf-8進行編碼
執行b=a.encode('utf-8')
則b為01010001,即0x61
將b存儲到文件中,假設命名為test.txt
那么這個時候文件中的內容就是01010001,即0x61,就只有這么一個字節
也就是,下次你直接打開這個文件,并且讀取文件中的內容
你會發現,得到的是完好無損的字符a
因為系統默認會對二進制串用unicode解碼(任何加載到內存中的數據都是unicode格式)
而幸運的是對于字符a而言,unicode和utf-8兩種格式的映射關系是一樣的
如果保存的是中文字符,那么你大概率會得到一個亂碼
那么如何得到正確的字符呢?
可以在讀取的時候指定解碼格式,比如
open("test.txt").read().decode("utf-8")
實際上,open("test.txt").read()的返回值是該字符按照該編碼方式得到的二進制串
既然有二進制串這種數據,那么它肯定也屬于某種數據類型
在python3中,我們把二進制串這種數據的類型稱作bytes
而字符a的數據類型是str
str被編碼后得到bytes,bytes是二進制串,能直接存儲和傳輸
當然,如果直接打印bytes類型的數據的話,
我們也不會看到類似0101010001這樣的結果,python會用0x61這樣的十六進制表示方法來代替~
?
轉載于:https://www.cnblogs.com/jiage666/p/9853786.html
總結
以上是生活随笔為你收集整理的python3中的编码与解码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu下搜狗输入法乱码(二)
- 下一篇: python之路-day19-面向对象之