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

emr*_*esu 3 python irc python-3.x 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):
    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")
Run Code Online (Sandbox Code Playgroud)

小智 6

您可以跳过该错误。而不是以下部分:

response = s.recv(1024).decode("utf-8")
Run Code Online (Sandbox Code Playgroud)

使用这个:

response = s.recv(1024).decode('utf-8', 'ignore')
Run Code Online (Sandbox Code Playgroud)


Pau*_*ght 6

您正在从网络读取多字节字符的一部分。您的缓冲区为 1024 字节,您会在该缓冲区的末尾看到 0xe2,索引为 1023。代码点大于 127 的非 ASCII 字符在 UTF-8 中是多字节的,并且您无法控制分割的位置从网络读取内容,因此如果您不幸的话,您会看到一个字符在对recv(). 如果您设置“忽略”选项来解码,您将丢弃该字符,实际上是丢弃它。

如果您只是寻找“ping”,那么删除其他内容可能就可以了,因为您正在寻找的文本是纯 ASCII。如果您需要所有这些文本(例如,将其显示给用户),则必须在尝试解码来自网络的字节字符串之前检查未终止的字符。Python 的codecs模块为此提供了增量编码/解码器接口,您可以向增量解码器提供字节,它将输出它可以解码的任何字符,并通过保留调用之间的状态来处理它不能解码的字符。有关示例,请参阅https://docs.python.org/3/library/codecs.html#incremental-encoding-and-decoding文档和python 解码部分 utf-8 字节数组。