Python IRC 机器人与编码问题

3 投票
4 回答
2970 浏览
提问于 2025-04-15 11:59

目前我有一个用Python写的简单IRC机器人。

因为我把它迁移到了Python 3.0,这个版本区分字节和Unicode字符串,所以我开始遇到编码问题。具体来说,就是有些人发送的不是UTF-8格式。

现在,我可以告诉大家都用UTF-8发送(其实他们本来就应该这样做),但更好的解决办法是让Python默认使用其他编码方式或者其他方法。

到目前为止,代码看起来是这样的:

data = str(irc.recv(4096),"UTF-8", "replace")

这至少不会抛出异常。不过,我想更进一步:我希望我的机器人默认使用另一种编码,或者尝试以某种方式检测“麻烦字符”。

另外,我还需要搞清楚mIRC使用的神秘编码到底是什么,因为其他客户端似乎工作正常,发送的都是UTF-8格式。

我该如何去做这些事情呢?

4 个回答

0

RichieHindle提到的chardet可能是你最好的解决方案。不过,如果你想处理大约90%的文本,你可以使用我用的方法:

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
3

chardet 这个库可以帮你,它是一个非常常用的Python库,用来识别不明的编码方式。

-1

好的,经过一些研究,我发现chardet在Python 3中有些问题。解决办法其实比我想的简单。我决定如果UTF-8不行,就退而求其次用CP1252:

data = irc.recv ( 4096 )
try: data = str(data,"UTF-8")
except UnicodeDecodeError: data = str(data,"CP1252")

这似乎是有效的。不过,它并不能检测编码,所以如果有人使用的编码既不是UTF-8也不是CP1252,我又会遇到问题。

这其实只是一个临时的解决办法。

撰写回答