Python 字节类型上的UnicodeDecodeError

Python 字节类型上的UnicodeDecodeError,python,python-3.x,utf-8,decode,utf-16,Python,Python 3.x,Utf 8,Decode,Utf 16,使用Python3.4,我在尝试使用utf-32解码字节类型时遇到以下错误 Traceback (most recent call last): File "c:.\SharqBot.py", line 1130, in <module> fullR=s.recv(1024).decode('utf-32').split('\r\n') UnicodeDecodeError: 'utf-32-le' codec can't decode bytes in position

使用Python3.4,我在尝试使用utf-32解码字节类型时遇到以下错误

Traceback (most recent call last):
  File "c:.\SharqBot.py", line 1130, in <module>
    fullR=s.recv(1024).decode('utf-32').split('\r\n')
UnicodeDecodeError: 'utf-32-le' codec can't decode bytes in position 0-3: codepoint not in range(0x110000)
在尝试解码到utf 16和32时,我是否做错了什么?我之所以想使用utf-32,是因为偶尔有人发送一个utf-8中没有的字符,我希望能够接收到这个字符,而不是因为utf-8不支持该字符而抛出错误。 感谢您的帮助。

如果
解码为UTF-8不起作用,则每个Unicode序号都可以用UTF-8表示,这是因为传输的字节采用不同的编码,或者数据是混合文本和二进制数据,并且只有一部分是UTF-8。很可能文本是UTF-8编码的(大多数网络协议都是),因此非UTF-8数据可能是帧数据或类似数据,需要解析以提取文本数据


任何试图在文本/二进制情况下掩盖这样一个错误的尝试都只是沉默问题,而不是修复问题。您需要知道数据的编码(以及格式,如果不是使用单一编码的所有文本数据),并使用该编码。您收到的数据不会因为您的需要而神奇地变成UTF-16或UTF-32。

尝试使用编码='ISO-8859-1'

您可以尝试使用解码/编码('UTF-16-le')。我试过了,对我来说没问题。但我不太清楚原因P

例如,使用
decode('utf-8',errors='replace')
。我并不是试图一起避免错误,而是试图接收utf-8中不支持的字符。因此,您可以尝试使用utf-8解码整行。如果抛出异常,则仅尝试另一个字符集。我怀疑IRC协议是否会允许UTF-16,32,因为嵌入式NUL“当我使用UTF-8解码时,没有错误”。那么,为什么您认为UTF-16或UTF-32应该起作用呢?IRC没有指定文本编码。@CodeWarrior:大概原始文本是
latin-1
(ISO-8859-1的友好名称)编码的,而不是
UTF-8
。或者它不是,但是
latin-1
是一种一对一编码,每个字节映射到一个字符,所以它只是掩盖错误并产生胡言乱语。无论哪种方式。请尝试更清楚地回答,并解释为什么这对你有效。也许描述一下你的方法和OP的不同之处
  File "c:.\SharqBot.py", line 1128, in <module>
    fullR=s.recv(1024).decode('utf-16').split('\r\n')
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x0a in position 374: truncated data
b':tmi.twitch.tv 001 absolutelyabot :Welcome, GLHF!\r\n:tmi.twitch.tv 002 absolutelyabot :Your host is tmi.twitch.tv\r\n:tmi.twitch.tv 003 absolutelyabot :This server is rather new\r\n:tmi.twitch.tv 004 absolutelyabot :-\r\n:tmi.twitch.tv 375 absolutelyabot :-\r\n:tmi.twitch.tv 372 absolutelyabot :You are in a maze of twisty passages, all alike.\r\n:tmi.twitch.tv 376 absolutelyabot :>\r\n'