繁体   English   中英

将数据从新闻提要传递到IRC服务器时,如何正确处理编码

[英]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个技巧是:

  1. 尽早解码
  2. 到处都是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM