Python UnicodeDecodeError:&x27;utf-8';编解码器可以';t解码位置1023处的字节0xe2:数据意外结束

Python UnicodeDecodeError:&x27;utf-8';编解码器可以';t解码位置1023处的字节0xe2:数据意外结束,python,python-3.x,irc,twitch,Python,Python 3.x,Irc,Twitch,基本上,我已经用Python制作了一个IRC Twitch机器人,它现在除了加入频道之外什么都不做。乒乓球循环正常运行了一段时间,但随后由于标题中的错误而停止。我做错了什么?提前谢谢 import re import socket HOST = "irc.twitch.tv" PORT = 6667 NICK = "asdsad" PASS = "oauth:asdasdasdasd" channel = "#coolperson" def send_message(sock, msg):

基本上,我已经用Python制作了一个IRC Twitch机器人,它现在除了加入频道之外什么都不做。乒乓球循环正常运行了一段时间,但随后由于标题中的错误而停止。我做错了什么?提前谢谢

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")
你可以跳过这个错误。 而不是以下部分:

response = s.recv(1024).decode("utf-8")
使用这个:

response = s.recv(1024).decode('utf-8', 'ignore')

您正在从网络中读取多字节字符的一部分。您的缓冲区是1024字节,在该缓冲区的末尾可以看到0xe2,索引1023。代码点大于127的非ASCII字符在UTF-8中是多字节的,在从网络读取内容时,您无法控制拆分的位置,因此,如果您运气不好,您将在调用
recv()
时看到字符拆分。如果将“忽略”选项设置为“解码”,则会将该字符丢弃,实际上会将其丢弃

如果您只是在寻找“ping”,删除其他内容可能没问题,因为您要查找的文本是纯ASCII文本。如果您需要所有这些文本(例如,向用户显示),那么在尝试从网络解码字节字符串之前,您必须检查是否存在未终止字符。Python的
编解码器
模块为此提供了增量编码/解码器接口,您可以输入增量解码器字节,它将输出任何可以解码的字符,并通过在调用之间保留状态来处理不能解码的字符。有关文档和示例,请参阅