UnicodeDecodeError:'utf-8'编解码器无法解码第1023个位置的字节0xe2:数据意外结束

4

基本上,我用Python制作了一个IRC Twitch机器人,目前除了加入频道外什么也不做。Ping-pong循环一段时间后会出现标题中的错误而停止工作。我做错了什么?谢谢。

import re
import socket

HOST = "irc.twitch.tv"
PORT = 6667
NICK = "asdsad"
PASS = "oauth:asdasdasdasd"
channel = "#coolperson"

def send_message(sock, msg):
    sock.send("PRIVMSG #{} {}".format(channel, msg))

s = socket.socket()
s.connect((HOST, PORT))
s.send("PASS {}\r\n".format(PASS).encode("utf-8"))
s.send("NICK {}\r\n".format(NICK).encode("utf-8"))
s.send("JOIN {}\r\n".format(channel).encode("utf-8"))

while True:
    response = s.recv(1024).decode("utf-8")
    if response == "PING :tmi.twitch.tv\r\n":
        s.send("PONG :tmi.twitch.tv\r\n".encode("utf-8"))
        print("answered the call")
2个回答

7
您可以跳过该错误。而不是以下部分:
response = s.recv(1024).decode("utf-8")

请使用这个:
response = s.recv(1024).decode('utf-8', 'ignore')

5
您正在从网络接收到一个多字节字符的一部分。您的缓冲区大小为1024字节,且在该缓冲区的末尾,即索引1023处,您看到了0xe2。 在UTF-8中,代码点大于127的非ASCII字符是多字节的,并且当从网络读取数据时,您不能控制拆分位置,因此如果运气不好,您会在recv()调用之间看到跨越字符拆分。如果您将“ignore”选项设置为解码,则将丢弃该字符,效果就是舍弃它。
如果您只需要找到“ping”,则丢弃其他东西可能没问题,因为您要寻找的文本是纯ASCII的。如果您需要所有这些文本(例如,将其显示给用户),在尝试从网络解码字节字符串之前,您必须检查未终止的字符。Python的codecs模块为此提供了增量编码/解码接口,您可以向增量解码器提供字节,并输出解码后的任何字符,并通过在调用之间保留状态来处理它无法解码的字符。请参阅https://docs.python.org/zh-cn/3/library/codecs.html#incremental-encoding-and-decoding获取文档,了解详情并参考python decode partial utf-8 byte array了解示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接