如何在将数据从新闻馈送到IRC服务器时正确处理编码

0 投票
4 回答
1892 浏览
提问于 2025-04-16 21:37

代码:

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')

它可以连接等等,但当我在频道里输入 !latest 的时候,它就直接退出了,显示这个:

    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)

你能帮我调试一下这个代码吗?之前它是可以正常工作的。

4 个回答

0

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字符。

0

你需要把发给IRC服务器的字符串进行编码。而且,根据feedparser返回的内容,你可能还需要从某种特定的编码中解码它。

编码的方式取决于feed里面包含了什么内容。

1

IRC协议并没有规定消息使用特定的字符编码,它实际上是一个8位的协议,其中有一些字节是用来表示控制字符的。(具体可以参考rfc1459第2.2节

据说,流行的mIRC客户端会解码utf8序列,如果它能识别这些序列的话。这对于IRC的使用来说是很合理的,因为ASCII字符的编码和它们的字节是一样的,而非ASCII字符的编码值都大于127。

在Python中,可以用unicode.encode(encoding='utf8')来表示:

>>> u'\u0ca0_\u0ca0'.encode('utf8')
'\xe0\xb2\xa0_\xe0\xb2\xa0'

撰写回答