当前位置: 首页 > 面试题库 >

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

姜泰宁
2023-03-14
问题内容

我正在尝试编写一个脚本,该脚本通过创建随机utf-8编码的字符串,然后将其解码为unicode来生成随机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应以0xc0开头1100xaf开头都有效10

这是我的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)

问题答案:

实际上,这是无效的UTF-8。在UTF-8中,只能使用两个字节对U + 0080到U +
07FF(含)范围内的代码点进行编码。仔细阅读Wikipedia文章,您将看到相同的内容。结果,该字节0xc0可能永远不会出现在UTF-8中。的情况也是如此0xc1

一些UTF-8解码器具有错误的解码序列,例如C0 AF有效的UTF-8,这在过去已导致安全漏洞。



 类似资料:
  • 问题内容: 我正在使用脚本,但在执行此操作时在服务器日志中发现了此错误, ``这里 函数返回。 张贴这个问题之前我已经提到这个 问题,操作系统,所以的。 更新 下一行损害了JSON编码器, 我有一个临时解决方案 但是我不确定这样做是否正确。 问题答案: 该错误是因为字典中存在一些非ASCII字符,并且无法对其进行编码/解码。避免此错误的一种简单方法是使用以下函数对此类字符串进行编码(如果字符串为非

  • 问题内容: 我正在使用Python-2.6 CGI脚本,但是在执行服务器日志时发现此错误, 这里 函数返回。 张贴这个问题之前我已经提到这个问题,操作系统,所以的。 更新 下一行损害了JSON编码器, 我有一个临时解决方案 但是我不确定这样做是否正确。 问题答案: 该错误是因为字典中存在一些非ASCII字符,并且无法对其进行编码/解码。避免此错误的一种简单方法是使用encode()如下函数对此类字

  • 我正在使用脚本,但在执行时在服务器日志中发现此错误, ​在这里 函数返回。 在发布此问题之前,我已将此问题提交给了SO。 下面这行代码伤害了JSON编码器, 我找到了一个临时的解决办法 但是我不确定这样做是否正确。

  • 问题内容: 我正在尝试使用python 2.7.12从json文件读取twitter数据。 我使用的代码是这样的: 结果我得到: 我仔细研究了类似问题的所有答案,并想出了这段代码,它在上一次有效。我不知道为什么现在不起作用…我将不胜感激! 问题答案: 这对您没有帮助,这会使事情进一步混乱- 这是一个讨厌的黑客,您需要将其从代码中删除。 错误正在发生,因为是一个字符串,您正在调用。仅当字符串是Uni

  • 我正在用python 2.7版在App Engine(谷歌云平台)上做一个小烧瓶服务器,我对带有重音符号和“ñ”字母的字母有问题。我在这里分享我的代码: 但当我将此代码上传到App Engine并调用此服务时,服务器会发送代码500,并在错误报告中显示下一条消息: UnicodeDecodeError:'utf8'编解码器无法解码位置22中的字节0xf3:无效的延续字节 我不能这样解决这个问题:

  • 问题内容: https://github.com/affinelayer/pix2pix- tensorflow/tree/master/tools 在上述站点上编译“ process.py”时发生错误。 追溯(最近一次通话): 错误原因是什么?Python的版本是3.5.2。 问题答案: Python尝试将字节数组(假定为utf-8编码的字符串)转换为unicode字符串()。当然,此过程是根据