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

Posted

技术标签:

【中文标题】UnicodeDecodeError:“utf-8”编解码器无法解码位置 1023 中的字节 0xe2:数据意外结束【英文标题】:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 1023: unexpected end of data 【发布时间】:2018-10-30 10:43:48 【问题描述】:

基本上,我已经用 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")

【问题讨论】:

【参考方案1】:

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

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

使用这个:

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

【讨论】:

【参考方案2】:

您正在从网络读取多字节字符的一部分。您的缓冲区为 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 decode partial utf-8 byte array。

【讨论】:

以上是关于UnicodeDecodeError:“utf-8”编解码器无法解码位置 1023 中的字节 0xe2:数据意外结束的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte...

UnicodeDecodeError:“utf-8”编解码器无法解码位置 0 的字节 0xff

UnicodeDecodeError:“utf-8”编解码器无法解码位置 34 中的字节 0x85:无效的起始字节

UnicodeDecodeError:“utf-8”编解码器无法解码位置 35 中的字节 0x96:无效的起始字节

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

UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xc0 in position 0: invalid start byte报错解决