日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python3中的编码与解码

發(fā)布時(shí)間:2025/4/9 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3中的编码与解码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先,為什么要編碼?

我們知道,計(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)行了分類(lèi)

如果是英文字母及常規(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ù)類(lèi)型

python中的解碼與編碼分別由decode和encode兩個(gè)模塊實(shí)現(xiàn)

python(或者任何編程語(yǔ)言)中的編碼如果沒(méi)有指定編碼格式的話(huà),默認(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)制串呀,這次編碼操作只是為了用戶(hù)查看它的編碼結(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ù)類(lèi)型

在python3中,我們把二進(jìn)制串這種數(shù)據(jù)的類(lèi)型稱(chēng)作bytes

而字符a的數(shù)據(jù)類(lèi)型是str

str被編碼后得到bytes,bytes是二進(jìn)制串,能直接存儲(chǔ)和傳輸

當(dāng)然,如果直接打印bytes類(lèi)型的數(shù)據(jù)的話(huà),

我們也不會(huì)看到類(lèi)似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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。