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