当前位置: 首页 > 知识库问答 >
问题:

Python:UnicodeDecodeError:“utf-8”编解码器无法解码位置0中的字节0x80:无效的开始字节

仲孙鸿飞
2023-03-14

我从目录中获取数据,它以字节格式提供数据。

字节数据:

b'\x80\x00\x00\x00\n\x00\x00%\x83\xa0\x08\x01\x00\xbb@\x00\x00\x05p 
\x02\x00>\xf3\x00\x00\x00}\x02\x00`\x03\xef0\x00\x00\r\xc0 
\x06\xf0>\xf3\x00\x00\x02\x88\x02\x03\xec\x03\xef0\x00\x00/.....'

在以字符串或任何可读格式转换此数据时,我遇到以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

我使用的代码(Python 3.7.3):

blobs = blob.decode('utf-8')

而且

import json
json.dumps(blob.decode())

我还使用了泡菜astpprint,但它们在这里没有帮助。

我尝试的是:

  • UnicodeDecodeError:“utf8”编解码器无法解码位置0中的字节0xa5:无效的开始字节

共有3个答案

端木鹏
2023-03-14

您的示例中的数据显然不是任何常用编码中的文本。Python和我们都无法找到将显然不是文本的数据转换为字符串的方法。

如果这是一种定义良好的二进制文件格式,请为此格式找到一个解析器(理想情况下是一个流行的Python库,但对于更模糊或专有的格式,您可能找不到),或者如果您能够通过巧妙的实验和良好的猜测,或者通过查找(如果不是权威性的,则可能或多或少是推测性的第三方)文档。

如果您只是想将字节转换为具有相同Unicode代码点的字符串代码点(例如,输入字节\xff映射到Unicode代码点U 00FF),则'latin-1'编码可以实现这一点,虽然不明显,但很方便。这种情况下的结果显然不是有用的人类可读文本;在许多方面,将数据保留为字节会更自然、更不容易出错,也更方便。

东郭远航
2023-03-14

您可以尝试忽略非可读块。

blobs。解码('utf-8','ignore')

这不是一个很好的解决方案,但是生成字节对象的方式有一些问题。也许,utf-8不是数据的正确编码。

计光赫
2023-03-14

UTF-8编码有一些内置冗余,至少有两个目的:

起始字节(以二进制点表示,携带实际数据)与以下4种模式之一匹配

0.......
110.....
1110....
11110...

而连续字节(0到3)总是这种形式

10......

如果不遵守此编码,可以安全地说它不是UTF-8数据,例如,因为在传输过程中发生了损坏。

为什么可以说b'\x80\'不能是UTF-8?已经在头两个字节处违反了编码:因为80必须是一个延续字节。这正是您的错误消息所说的:

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

即使跳过这一步,在b“%\x83”的几个字节后也会遇到另一个问题,因此很可能是您试图解码错误的数据,或者假设编码错误。

 类似资料: