UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 1023: unexpected end of data

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 1023: unexpected end of data

基本上,我在 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")

您可以跳过该错误。 代替以下部分:

response = s.recv(1024).decode("utf-8")

使用这个:

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

您正在从网络中读取多字节字符的一部分。您的缓冲区是 1024 字节,您在该缓冲区的末尾看到 0xe2,索引 1023。代码点大于 127 的非 ASCII 字符在 UTF-8 中是多字节的,您无法控制拆分的位置从网络读取内容,所以如果你不走运,你会看到一个字符在对 recv() 的调用中分裂。如果您将 'ignore' 选项设置为解码,您将丢弃该字符,有效地丢弃它。

如果您只是在寻找 "ping",删除其他内容可能没问题,因为您要寻找的文本是纯 ASCII。如果您需要所有这些文本(例如,将其显示给用户),您必须在尝试从网络解码字节字符串之前检查未终止的字符。 Python 的 codecs 模块为此提供了增量 Encode/Decoder 接口,您可以输入增量解码器字节,它将输出它可以解码的任何字符并处理它不能通过在调用之间保持状态。有关示例,请参阅 https://docs.python.org/3/library/codecs.html#incremental-encoding-and-decoding for docs and