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

问题描述

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

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

解决方法

我正在尝试编写一个脚本,该脚本通过创建随机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,0xDF)