0

代码:

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

4 回答 4

1

IRC 协议没有定义用于消息的特定字符集编码,而是一个 8 位协议,它具有用于控制字符的某些八位字节。(参见rfc1459 第 2.2 节

显然,流行的 mIRC 客户端将解码 utf8 序列,如果它识别它们,这对于 irc 的使用非常有意义,因为 ascii 代码点使用与 ascii 字符相同的字节编码,而非 ascii 代码点都编码为值 > 127.

在 python 中,它是这样拼写的unicode.encode(encoding='utf8')

>>> u'\u0ca0_\u0ca0'.encode('utf8')
'\xe0\xb2\xa0_\xe0\xb2\xa0'
于 2011-07-15T16:18:30.690 回答
0

您必须对发布到 IRC 服务器的字符串进行编码。此外,根据 feedparser 返回的内容,您可能希望从特定编码对其进行解码。

编码取决于提要包含的内容。

于 2011-07-15T15:06:49.193 回答
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 字符。

于 2011-07-15T15:27:35.750 回答
0

我个人建议将所有字符串转换为“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. 编码晚
于 2012-04-21T00:52:30.217 回答