對python3編碼那些事的小小總結

1、 瞭解一下編碼的發展。
一、 計算機只能處理數字,若是須要處理文本,須要先將文本轉換爲數字。由於計算機是美國梆子發明的,因此他們發明了最先的編碼--ASCII編碼,也就是將他們的大小寫字符數字和一些符號編碼獲得計算機中。好比A的編碼是65。
二、 隨着計算機在中國發展起來,拿ASCII去處理中文,顯然是不夠的,由於英文須要一個字節處理,而中文是須要兩個字節。爲了知足需求咱們中國發明瞭本身的編碼GB2312。將中文編進去。
三、 咱們中國如此,世界上那麼多語言豈不是每種語言都須要一種編碼標準,若是一個文本中有多種語言,到時候產生的結果就是出現亂碼。
四、 爲順應發展,比較叼的Unicode編碼出生了,這個東西將全部的語言都統一到一套編碼中。這樣就不會再出現亂碼的問題。雖然這個東西夠強大,可是卻有一個不能小覷的缺點。相比於ASCII編碼要多出一倍的儲存空間。例如:A ascii:65 二進制:01000001 unicode:00000000 01000001
五、 因此秉承着節約的原則,UTF-8應運而生,好處編碼可變長。例如A的UTF-8:01000001,能夠將unicode編碼中的前面的零節約掉。
2、 在計算機 系統中通用編碼的工做方式
一、 當咱們編輯文檔的時候,讀取文檔內容將UTF-8字符轉換爲unicode字符到內存中。由於這裏須要顯示,爲了不亂碼,使用通用的Unicode編碼。
二、 當編碼編輯完成後,再將Unicode的編碼轉換爲UTF-8保存到文件中。由於這裏是須要存入磁盤中的,爲節約儲存空間,使用可變編碼長度的UTF-8編碼。
3、 python3字符編碼
python的字符串類型是str,在內存中以Unicode表示。
一、 若是須要在網絡上傳輸,或者保存到存儲設備上,就須要將str變成以字節爲單位的bytes。可使用encode()方法。經過第一大點的瞭解,咱們知道Unicode表示的str能夠經過ASCII和utf-8編碼轉換。可是轉換中文的時候,必定使用utf-8,由於含有中文的str沒法用ASCII編碼,超出了ASCII編碼的範圍。例如:
對python3編碼那些事的小小總結
二、 若是咱們從網絡上或磁盤上讀取數據,就是將bytes變爲str。可使用decode()方法。
對python3編碼那些事的小小總結
經過上述瞭解,能夠看出,utf-8編碼,不論是讀取數據,仍是傳輸數據都不會出錯,因此不少狀況下utf-8使用的更爲普遍一些。python

4、 解析我實際遇到的問題
使用socket模塊編寫通訊的腳本,原服務端:網絡

#!/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()

原客戶端:socket

#!/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()

執行結果
對python3編碼那些事的小小總結
send()方法用來傳遞數據,將hello傳遞給服務端。
錯誤提示須要將str類型的字符串轉換爲bytes。在咱們傳遞數據的時候應該先將str轉換爲bytes類型的數據方可。使用encode(‘utf-8’)或encode(‘ascii’);同時服務端的send()方法傳遞的數據也應該轉換一下。
服務端修改代碼:ide

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

客戶端修改代碼:3d

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

修改後執行結果:
對python3編碼那些事的小小總結
對python3編碼那些事的小小總結
執行成功。
執行過程當中,str被轉換爲bytes傳遞給對方。由於這裏傳遞的是字母,內容上看不出是bytes,可是字符串前有個字母b,表示bytes。若是傳遞的是中文:
對python3編碼那些事的小小總結
由於咱們將str轉換爲了bytes。因此當咱們接受數據的時候,應當將bytes轉換爲str
服務端修改代碼:
text=client.recv(1024).decode('utf-8')
客戶端修改代碼:
ans=c.recv(1024).decode('utf-8')
執行結果:
對python3編碼那些事的小小總結
總結完畢!!!blog

相關文章
相關標籤/搜索