對(duì)python3編碼那些事的小小總結(jié)

一、 了解一下編碼的發(fā)展。
1、 計(jì)算機(jī)只能處理數(shù)字,如果需要處理文本,需要先將文本轉(zhuǎn)換為數(shù)字。因?yàn)橛?jì)算機(jī)是美國(guó)梆子發(fā)明的,所以他們發(fā)明了最早的編碼--ASCII編碼,也就是將他們的大小寫(xiě)字符數(shù)字和一些符號(hào)編碼得到計(jì)算機(jī)中。比如A的編碼是65。
2、 隨著計(jì)算機(jī)在中國(guó)發(fā)展起來(lái),拿ASCII去處理中文,顯然是不夠的,因?yàn)橛⑽男枰粋€(gè)字節(jié)處理,而中文是需要兩個(gè)字節(jié)。為了滿足需求我們中國(guó)發(fā)明了自己的編碼GB2312。將中文編進(jìn)去。
3、 我們中國(guó)如此,世界上那么多語(yǔ)言豈不是每種語(yǔ)言都需要一種編碼標(biāo)準(zhǔn),如果一個(gè)文本中有多種語(yǔ)言,到時(shí)候產(chǎn)生的結(jié)果就是出現(xiàn)亂碼。
4、 為順應(yīng)發(fā)展,比較叼的Unicode編碼出生了,這個(gè)東西將所有的語(yǔ)言都統(tǒng)一到一套編碼中。這樣就不會(huì)再出現(xiàn)亂碼的問(wèn)題。雖然這個(gè)東西夠強(qiáng)大,但是卻有一個(gè)不能小覷的缺點(diǎn)。相比于ASCII編碼要多出一倍的儲(chǔ)存空間。例如:A ascii:65 二進(jìn)制:01000001 unicode:00000000 01000001
5、 所以秉承著節(jié)約的原則,UTF-8應(yīng)運(yùn)而生,好處編碼可變長(zhǎng)。例如A的UTF-8:01000001,可以將unicode編碼中的前面的零節(jié)約掉。
二、 在計(jì)算機(jī) 系統(tǒng)中通用編碼的工作方式
1、 當(dāng)我們編輯文檔的時(shí)候,讀取文檔內(nèi)容將UTF-8字符轉(zhuǎn)換為unicode字符到內(nèi)存中。因?yàn)檫@里需要顯示,為了避免亂碼,使用通用的Unicode編碼。
2、 當(dāng)編碼編輯完成后,再將Unicode的編碼轉(zhuǎn)換為UTF-8保存到文件中。因?yàn)檫@里是需要存入磁盤(pán)中的,為節(jié)約儲(chǔ)存空間,使用可變編碼長(zhǎng)度的UTF-8編碼。
三、 python3字符編碼
python的字符串類型是str,在內(nèi)存中以Unicode表示。
1、 如果需要在網(wǎng)絡(luò)上傳輸,或者保存到存儲(chǔ)設(shè)備上,就需要將str變成以字節(jié)為單位的bytes??梢允褂胑ncode()方法。通過(guò)第一大點(diǎn)的了解,我們知道Unicode表示的str可以通過(guò)ASCII和utf-8編碼轉(zhuǎn)換。但是轉(zhuǎn)換中文的時(shí)候,一定使用utf-8,因?yàn)楹兄形牡膕tr無(wú)法用ASCII編碼,超出了ASCII編碼的范圍。例如:
對(duì)python3編碼那些事的小小總結(jié)
2、 如果我們從網(wǎng)絡(luò)上或磁盤(pán)上讀取數(shù)據(jù),就是將bytes變?yōu)閟tr??梢允褂胐ecode()方法。
對(duì)python3編碼那些事的小小總結(jié)
通過(guò)上述了解,可以看出,utf-8編碼,不管是讀取數(shù)據(jù),還是傳輸數(shù)據(jù)都不會(huì)出錯(cuò),所以很多情況下utf-8使用的更為廣泛一些。

創(chuàng)新互聯(lián)公司長(zhǎng)期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為石鼓企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站制作,石鼓網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

四、 解析我實(shí)際遇到的問(wèn)題
使用socket模塊編寫(xiě)通信的腳本,原服務(wù)端:

#!/usr/bin/python3
import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',6000))
s.listen(1)
client,addr=s.accept()
print ("Connected by",addr)
client.send("welcome")
text=client.recv(1024)
print(text)
client.close()
s.close()

原客戶端:

#!/usr/bin/python3
import socket

c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.connect(("192.168.80.128",6000))
ans=c.recv(1024)
print(ans)
c.send("hello")
c.close()

執(zhí)行結(jié)果
對(duì)python3編碼那些事的小小總結(jié)
send()方法用來(lái)傳遞數(shù)據(jù),將hello傳遞給服務(wù)端。
錯(cuò)誤提示需要將str類型的字符串轉(zhuǎn)換為bytes。在我們傳遞數(shù)據(jù)的時(shí)候應(yīng)該先將str轉(zhuǎn)換為bytes類型的數(shù)據(jù)方可。使用encode(‘utf-8’)或encode(‘a(chǎn)scii’);同時(shí)服務(wù)端的send()方法傳遞的數(shù)據(jù)也應(yīng)該轉(zhuǎn)換一下。
服務(wù)端修改代碼:

client.send("welcome".encode('utf-8'))

客戶端修改代碼:

c.send("hello".encode('utf-8'))

修改后執(zhí)行結(jié)果:
對(duì)python3編碼那些事的小小總結(jié)
對(duì)python3編碼那些事的小小總結(jié)
執(zhí)行成功。
執(zhí)行過(guò)程中,str被轉(zhuǎn)換為bytes傳遞給對(duì)方。因?yàn)檫@里傳遞的是字母,內(nèi)容上看不出是bytes,但是字符串前有個(gè)字母b,表示bytes。如果傳遞的是中文:
對(duì)python3編碼那些事的小小總結(jié)
因?yàn)槲覀儗tr轉(zhuǎn)換為了bytes。所以當(dāng)我們接受數(shù)據(jù)的時(shí)候,應(yīng)當(dāng)將bytes轉(zhuǎn)換為str
服務(wù)端修改代碼:
text=client.recv(1024).decode('utf-8')
客戶端修改代碼:
ans=c.recv(1024).decode('utf-8')
執(zhí)行結(jié)果:
對(duì)python3編碼那些事的小小總結(jié)
總結(jié)完畢?。?!

分享標(biāo)題:對(duì)python3編碼那些事的小小總結(jié)
本文URL:http://bm7419.com/article16/jjcjgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管電子商務(wù)、品牌網(wǎng)站設(shè)計(jì)云服務(wù)器、Google、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名