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



有时我在TCP服务器中遇到这个错误:

data=connection.recv(4096(.decode("utf-8-sig"(

文件"/usr/lib/python3.6/encodings/utf_8_sig.py";,第23行,解码中(输出,消耗(=编解码器.utf_8_decode(输入,错误,True(

UnicodeDecodeError:"utf-8"编解码器无法解码位置中的字节0xe05:连续字节无效

这是代码:

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")

如果我不把函数.decode("utf-8-sig"(我得到了这个错误:

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

如何防止这种情况发生?以前它使用utf-8,错误率高于utf-8-sig编码

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

最好的做法可能是在你试图解码之前,将你正在读取的数据作为调试信息进行转储

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

这将让你看到实际收到的内容,这样你就可以确认它是所需的格式。


以及。根据您在评论中显示的内容,它绝对不是UTF-8:

b'x03x00x00/*xe0x00x00x00x00x00Cookie: mstshash=Administrrnx01x00x08x00x03x00x00x00'

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

最新更新