2012-03-17 25 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