[英]How should I get my Tkinter IRC client to continuously read data from the IRC server?
[英]How can I handle encoding properly when passing data from a news feed to an IRC server
码:
import socket, feedparser
feed = feedparser.parse("http://pwnmyi.com/feed")
latest = feed.entries[0]
art_name = latest.title
network = 'irc.rizon.net'
port = 6667
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
irc.connect((network, port))
print irc.recv(4096)
irc.send('NICK PwnBot\r\n')
irc.send('USER PwnBot PwnBot PwnBot :PwnBot by Fike\r\n')
irc.send('JOIN #pwnmyi\r\n')
while True:
data = irc.recv(4096)
if data.find('PING') != -1:
irc.send('PONG ' + data.split() [1] + '\r\n')
if data.find( '!latest' ) != -1:
irc.send('PRIVMSG #pwnmyi :Latest Article: ' + art_name + '\r\n')
它连接等等,但是当我在通道中执行最新时,它就退出了:
irc.send('PRIVMSG #pwnmyi :Latest Article: ' + art_name + '\r\n')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 55: ordinal not in range(128)
您能帮我调试这段代码吗? 它曾经为我工作。
IRC协议没有定义用于消息的特定字符集编码,而是一种8位协议,其中包含用于控制字符的某些八位位组。 (请参阅rfc1459第2.2节 。
显然 ,流行的mIRC客户端会识别utf8序列,从而对utf8序列进行解码,这对于irc的使用来说是相当不错的意义,因为ascii代码点的编码字节与ascii字符相同,并且非ascii代码点的所有字节均编码为值> 127。
在python中,它的拼写是unicode.encode(encoding='utf8')
如下所示:
>>> u'\u0ca0_\u0ca0'.encode('utf8')
'\xe0\xb2\xa0_\xe0\xb2\xa0'
我个人建议将所有字符串转换为'utf-8',您可以使用以下方式对Unicode字符串进行编码/解码:
def decode(bytes):
try:
text = bytes.decode('utf-8')
except UnicodeDecodeError:
try:
text = bytes.decode('iso-8859-1')
except UnicodeDecodeError:
text = bytes.decode('cp1252')
return text
def encode(bytes):
try:
text = bytes.encode('utf-8')
except UnicodeEncodeError:
try:
text = bytes.encode('iso-8859-1')
except UnicodeEncodeError:
text = bytes.encode('cp1252')
return text
这是一个解释Python Unicode的优秀网站: http : //farmdev.com/talks/unicode
最好的3个技巧是:
您必须对发布到IRC服务器的字符串进行编码。 另外,根据feedparser返回的内容,您可能希望通过特定的编码对其进行解码。
编码取决于提要中包含的内容。
latest.title
包含非ASCII字符。
您必须删除它们,对其进行转义或翻译。
便宜而简单的方法是使用repr()
irc.send('PRIVMSG #pwnmyi :Latest Article: ' + repr(art_name) + '\r\n')
或更好
irc.send('PRIVMSG #pwnmyi :Latest Article: {0!r}\r\n'.format( art_name ) )
从长远来看,您需要在输入中解决非ASCII字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.