2012-03-17 55 views
1

我打算在python中設置一個小聊天程序。一切工作正常,直到我 發送一個字符串包含一個非ASCII字符,導致程序崩潰。該字符串從wx.TestCtrl讀取用套接字發送UTF-8

  • 如何發送字符串與UTF-8編碼通過套接字?

  • 爲什麼程序一開始就沒有問題?我已經將編碼設置爲UTF-8 ,那麼所有字符都不會導致程序崩潰?

以下是錯誤:

Traceback (most recent call last): 
    File "./client.py", line 180, in sendMess 
    outSock.sendto(s,self.serveraddr) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 26: 
        ordinal not in range(128) 

這裏是我創建套接字,並嘗試發送郵件:

outSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
    .... 
    outSock.sendto(s,self.serveraddr) 
+0

http://stackoverflow.com/questions/1644640/how-to-handle- unicode-non-ascii-characters-in-python – 2012-03-17 18:17:31

+0

謝謝!所以沒有辦法發送字符串而不解碼它? – nist 2012-03-17 18:20:10

+3

你不解碼發送,你*編碼* - 你把你的unicode字符串(它是*不* UTF-8,或至少不必),將它們轉換爲字節,併發送這些字節。另請參閱http://nedbatchelder.com/text/unipain.html瞭解更多背景信息。 – delnan 2012-03-17 18:20:29

回答

8

在Python 2,socket.sendto插座上花費「純」字符串,而不是unicode對象。因此,你必須進行編碼,說使用UTF-8:

outSock.sendto(s.encode('utf-8'), self.serveraddr) 

同樣,當你recvfrom(或類似),在另一端,你需要轉換回一個Unicode對象:

unicode_string = s.decode('utf-8') 

(在Python 3,你會bytes,這使得需要將其與unicode更明確的之間的轉換是工作。)

+0

這是一個有趣的問題與python 3,因爲你可能會得到一個不完整的Unicode字符。 – arhuaco 2014-09-03 07:38:13

+0

雖然,python 2也是如此;如果你給它一個部分的UTF-8序列,'s.decode('utf-8')'會爆炸你。一般來說,你會使用數據流而不是數據報,因此你知道什麼時候你有一個完整的消息(或者你可能會在數據報中實現類似的東西,或者限制消息長度,所以碎片不是風險或什麼的)。 – 2014-09-07 12:26:15