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

UnicodeDecodeError:'utf-8'编解码器无法解码位置5的字节0xe0:无效的延续字节

柯立果
2023-03-14

有时我在TCP服务器中遇到以下错误:

数据=连接。recv(4096)。解码(“utf-8-sig”)

file"/usr/lib/python3.6/编码/utf_8_sig.py",第23行,解码(输出,消耗)=codecs.utf_8_decode(输入,错误,True)

UnicodeDecodeError:'utf-8'编解码器无法解码位置5的字节0xe0:无效的延续字节

代码如下:

server_address = ('xx.xx.xx.xx', 10000)
    print('starting up on %s port %s' % server_address)
    sock.bind(server_address)
    # Listen for incoming connections. Cantidad de 25 coneciones entrantes en cola
    sock.listen(25)
    while True:
        # Wait for a connection
        print ('waiting for a connection')
        try:
            connection, client_address = sock.accept()
            print('connection from', client_address)
            # Receive the data in small chunks and retransmit it
            while True:
                #with decode we convert byte to string, default decode is utf-8
                data = connection.recv(4096).decode("utf-8-sig")

如果我不把函数。解码(“utf-8-sig”)我得到了这个错误:

TypeError:需要类似字节的对象,而不是“str”

我怎样才能防止这种情况?以前它使用utf-8,错误率高于utf-8-sig编码

共有1个答案

景正文
2023-03-14

0xe0是无效的连续字节,因为它以位模式111开始,而不是10(请参见此处)。这意味着几乎可以肯定的是,你得到的和你期望得到的之间存在着不匹配。

最好的做法可能是在尝试解码之前,将正在读取的数据作为调试信息转储。这可以通过以下方式实现:

data = connection.recv(4096)
print("DEBUG", data)
data = data.decode("utf-8-sig")

这将让您看到实际收到的内容,因此您可以确认它是所需的格式。

还有。根据你在评论中显示的,它绝对不是UTF-8:

b'\x03\x00\x00/*\xe0\x00\x00\x00\x00\x00Cookie: mstshash=Administr\r\n\x01\x00\x08\x00\x03\x00\x00\x00'

有趣的是,这里和这里都有一些链接,它们描述了包含mstshash=administrar字符串的会话,这些字符串可能是RDP黑客攻击的尝试。因此,您可能需要花一些精力了解这些会话的来源,并可能进一步加强您的网络。

 类似资料: