python:UnicodeDecodeError:'utf8'编解码器无法解码位置0的字节0xc0:无效的起始字节

Posted

技术标签:

【中文标题】python:UnicodeDecodeError:\'utf8\'编解码器无法解码位置0的字节0xc0:无效的起始字节【英文标题】:python: UnicodeDecodeError: 'utf8' codec can't decode byte 0xc0 in position 0: invalid start bytepython:UnicodeDecodeError:'utf8'编解码器无法解码位置0的字节0xc0:无效的起始字节 【发布时间】:2014-07-09 10:39:02 【问题描述】:

我正在尝试编写一个脚本,该脚本通过创建随机 utf-8 编码字符串然后将其解码为 un​​icode 来生成随机 unicode。它适用于单个字节,但有两个字节则失败。

例如,如果我在 python shell 中运行以下命令:

>>> a = str()

>>> a += chr(0xc0) + chr(0xaf)

>>> print a.decode('utf-8')

UnicodeDecodeError: 'utf8' codec can't decode byte 0xc0 in position 0: invalid start byte

根据 utf-8 方案https://en.wikipedia.org/wiki/UTF-8#Description,字节序列0xc0 0xaf 应该是有效的,因为0xc0110 开头,0xaf10 开头。


这是我的 python 脚本:

def unicode(self):
    '''returns a random (astral) utf encoded byte string'''
    num_bytes = random.randint(1,4)
    if num_bytes == 1:
        return self.gen_utf8(num_bytes, 0x00, 0x7F)
    elif num_bytes == 2:
        return self.gen_utf8(num_bytes, 0xC0, 0xDF)
    elif num_bytes == 3:
        return self.gen_utf8(num_bytes, 0xE0, 0xEF)
    elif num_bytes == 4:
        return self.gen_utf8(num_bytes, 0xF0, 0xF7)

def gen_utf8(self, num_bytes, start_val, end_val):
    byte_str = list()
    byte_str.append(random.randrange(start_val, end_val)) # start byte
    for i in range(0,num_bytes-1):
        byte_str.append(random.randrange(0x80,0xBF)) # trailing bytes
    a = str()
    sum = int()
    for b in byte_str:
        a += chr(b) 
    ret = a.decode('utf-8')
    return ret

if __name__ == "__main__":
    g = GenFuzz()
    print g.gen_utf8(2,0xC0,0xDF)

【问题讨论】:

请注意,您的函数可能会随机尝试生成 U+D800 到 U+DFFF 范围内的代码点,这也是无效的。 【参考方案1】:

找到一个实际接受 0xc0 的标准:encoding="ISO-8859-1" 来自https://***.com/a/27456542/4355695

但这需要确保文件的其余部分没有 unicode 字符,所以这不是问题的确切答案,但可能对像我这样没有任何 unicode 字符的人有帮助无论如何文件,只是想让python加载该死的东西,而utf-8和ascii编码都出错了。

有关 ISO-8859-1 的更多信息:What is the difference between UTF-8 and ISO-8859-1?

【讨论】:

这个答案应该附加到另一个问题上。 这个(OP)是我在寻找这个(我的)答案时遇到的问题。 好的,在这里创建了一个单独的问题:***.com/questions/49845554/…【参考方案2】:

这确实是无效的 UTF-8。在 UTF-8 中,只有 U+0080 到 U+07FF 范围内的代码点可以使用两个字节进行编码。更仔细地阅读***的文章,你会看到同样的事情。因此,字节 0xc0 可能永远不会出现在 UTF-8 中。 0xc1也是如此。

一些 UTF-8 解码器错误地将 C0 AF 等序列解码为有效的 UTF-8,这在过去导致了安全漏洞。

【讨论】:

那么可以容忍0xc0 的编码是什么?或者,我如何从我的文件中删除这个烦人的角色?我的 pandas read_table 函数在这里卡住了。 这是一个很难回答的问题。这就像说你家里有一只饥饿的猫。我不知道你是否应该因为它是你的猫而喂它,是否应该因为它是一只流浪猫而打电话给动物控制中心,或者是否有一只老虎从动物园里松了出来,你有一个严重的问题。数据也是如此。我不知道您是因为 0xc0 很重要而想要保留它,还是因为您对近似数据没问题而将其删除,或者您首先拥有 0xc0 的事实是否表明其他地方存在严重问题。 找到了解决方法:encoding="ISO-8859-1" from ***.com/a/27456542/4355695 你不必为别人的数据太紧张,杀错猫后果由他们承担:P @nikhilvj:如果我只是想让其他人承担做出不知情决定的后果,我不会在这个网站上回答问题。

以上是关于python:UnicodeDecodeError:'utf8'编解码器无法解码位置0的字节0xc0:无效的起始字节的主要内容,如果未能解决你的问题,请参考以下文章

Python的pymssql库中的UnicodeDecodeError

python2 当中 遇到 UnicodeDecodeError UnicodeDecodeError: 'ascii' codec can't decode byte 0xe

Python UnicodeDecodeError

切换到 Python 3 导致 UnicodeDecodeError

解决问题解决python安装模块时UnicodeDecodeError

Python读取内容UnicodeDecodeError错误