最近在看《python核心程式設計第三版》,wesley chun的書,在練習過程中發現第二章網路程式設計關於tcp和udp的例子在python 3.6.0 的環境下竟然無法正常執行,如是上網搜尋相關資料終於講問題弄明白了。
參考資料:
大體原因是python3.3之後python對字元處理做了比較大的改進,導致與以前的不相容。
這是python3.6環境下可以正常執行的udp服務端
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from socket import *
from time import ctime
myip = ''
myport = 9527
bufsiz = 1024
addr = (myip,myport)
udpsersock = socket(af_inet,sock_dgram)
udpsersock.bind(addr)
while
true:
print('waiting for message...')
data,addr = udpsersock.recvfrom(bufsiz)
#接受到的是utf-8編碼的位元組流,我們將其解碼成python本地化的unicode字元後再做操作
senddata = '[%s] %s' %(ctime(),data.decode("utf-8"))
#傳送時將python本地化的unicode字元編碼成utf-8位元組流
udpsersock.sendto(senddata.encode('utf-8'),addr)
print('...received from and returned to :',addr)
udpsersock.close()
這是python3.6環境下可以正常執行的udp客戶端(支援中文輸入輸出)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
from socket import *
service_ip = '10.168.0.197'
service_port = 9527
bufsiz = 1024
addr = (service_ip,service_port)
udpclisock = socket(af_inet,sock_dgram)
while
true:
#接受終端輸入(一般為標準輸入stdin),這裡是python本地化的unicode字元
data = input(">")
ifnot data:
break
#傳送時將python本地化的unicode字元編碼成utf-8位元組流
udpclisock.sendto(data.encode('utf-8'),addr)
data,addr = udpclisock.recvfrom(bufsiz)
ifnot data:
break
#終端不一定支援utf-8編碼字元的顯示,將上面接受到的uft-8位元組流解碼成python本地化的unicode字元再輸出到終端
print(data.decode('utf-8'))
#也可以顯示的將python本地化的unicode字元編碼成終端支援的編碼方式(遠端終端最好也不要這麼用)
#print data.decode('utf-8').encode(sys.stdout.encoding)
udpclisock.close()
這是python2.7環境下可以正常執行的udp客戶端(支援中文輸入輸出)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
from socket import *
service_ip = '10.168.0.197'
service_port = 9527
bufsiz = 1024
addr = (service_ip,service_port)
udpclisock = socket(af_inet,sock_dgram)
while
true:
#python 2.x與python3不同,這裡終端輸入的是編碼之後的位元組流,我們需要根據終端的編碼方式,解碼成python本地化的unicode字元
data = raw_input(">").decode(sys.stdin.encoding)
ifnot data:
break
#傳送時將python本地化的unicode字元編碼成utf-8位元組流
udpclisock.sendto(data.encode("utf-8"),addr)
data,addr = udpclisock.recvfrom(bufsiz)
ifnot data:
break
#終端不一定支援utf-8編碼字元的顯示,將上面接受到的uft-8位元組流解碼成python本地化的unicode字元再輸出到終端
print(data.decode('utf-8'))
#也可以顯示的將python本地化的unicode字元編碼成終端支援的編碼方式(遠端終端最好也不要這麼用)
#print data.decode('utf-8').encode(sys.stdout.encoding)
udpclisock.close()
python 本地化的unicode編碼是何種形式的編碼這需要檢視python源**才能知道,可能各個平台下面的實現並不一定一致,其實我們作為使用者不需要關心這些具體的實現細節。
utf-16和utf-8是最流行的unicode編碼方案:
1.windows平台下面unicode的編碼方案是utf-16,所以很多vc程式設計師第一印象就是unicode字元(寬字元)佔2個位元組
2.utf-8是最利於儲存和傳輸的編碼方式
3.在python3程式中,我們盡量將從檔案和網路上拿到的字元解碼成pthon自身的unicode字元(如:decode(『uft-8』))來操作,而在儲存和網路傳輸時根據具體需求和平台使用合適的編碼方式(如:encode(『utf-8』))。
python之字元編碼
python3 d a.py 1 先啟動python直譯器 2 直譯器會將a.py的內容當成普通記憶體從硬碟讀入記憶體,此時沒有語法意義 3 直譯器會解釋執行剛剛讀入記憶體的記憶體,開始識別python語法 1 相同點 python直譯器是解釋執行檔案內容的,因而python直譯器具備讀py檔案的功...
python之字元編碼
1.以什麼編碼存的就以什麼編碼取出 記憶體固定使用unicode編碼 我們可以控制的編碼是往硬碟存放或者基於網路傳輸選擇編碼。2.資料是最先產生於記憶體中,是unicode格式,要想傳輸需要轉成bytes格式 unicode encode utf 8 bytes 拿到bytes,就可以往檔案記憶體存...
字元編碼學習筆記
1.編碼方式 數字 代表什麼 顯示為什麼 編碼 ascii,gbk,unicode 字型檔案 編碼,點陣字型 所謂的編碼,是用預先規定的方法將文字 數字或其他物件程式設計數碼。ascii碼 用乙個位元組的低七位來表示英文本元 數字和其他一些符號。也就是 說我們看到的這些字元 數字在計算機中都有對應的...