python學習筆記之字元編碼

2021-08-02 17:58:20 字數 3169 閱讀 2797

最近在看《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碼 用乙個位元組的低七位來表示英文本元 數字和其他一些符號。也就是 說我們看到的這些字元 數字在計算機中都有對應的...