Python解码() 'utf-8'编解码器无法解码第0个字节的0xff:起始字节无效。

5

我正在构建这个套接字应用程序,但每次都会出现以下错误:
UnicodeDecodeError:'utf-8'编解码器无法解码位置0处的字节0xff:无效的起始字节

以下是服务器中相关的行:

    filename = client_sock.recv(1024).decode()
    filesize = client_sock.recv(1024).decode()

以下是客户反馈的相关内容:

    self.sock.send(file_dir.encode())
    self.sock.send(str(filesize).encode())

错误消息发生在服务器的第二行 (filesize =)。以下是客户端将发送给服务器的打印内容。
    print(file_dir) # Output is D:/Statispic2/Photos/photo3.jpg
    print(filesize) # Output is 96523

这个错误有时会发生,非常奇怪。我看过其他类似问题的提问,但他们的解决方案要么不起作用,要么不相关。

如果您想查看整个代码或有任何问题,请告诉我! 非常感谢!

3个回答

1
错误发生的原因是该字节无法被解码为utf-8,您可以在异常处理中将其作为异常处理,并将其解码为'utf-16':
filename = client_sock.recv(1024)
filesize = client_sock.recv(1024)
try:
    decoded_filename = filename.decode()
    decoded_filesize = filename.decode()
except UnicodeDecodeError:
    decoded_filename = filename.decode('utf-16')
    decoded_filesize = filename.decode('utf-16')

或者,您可以忽略解码过程中的异常,但这并不是推荐的方式...

filename = client_sock.recv(1024).decode("utf-8", "ignore")
filesize = client_sock.recv(1024).decode("utf-8", "ignore")

嗨,我已经尝试按照你说的做了,但是在这一行代码中出现了以下错误: filename = client_sock.recv(1024).decode('utf-16') UnicodeDecodeError: 'utf-16-le' 编解码器无法解码第16-17个字节:非法编码。 - Tomer Cahal
如果我忽略它们会发生什么?很可能会出现错误的字符串,对吧? - Tomer Cahal
忽略无法解码为UTF-8的字符,所有剩余字符将被正确解码。 - Andriy Ivaneyko
这是一个非常长的字符串,我不认为我能在这里放置它。 - Tomer Cahal
这里是一个链接,指向一个 Google 文档文件,其中包含被编码的消息,这些消息正在发送到服务器。 https://docs.google.com/document/d/1pjVEy72xTigazaDzNLrJ8B7vAHynC-chWGXjNV3qDm4/edit - Tomer Cahal
显示剩余3条评论

0

我之前也遇到过类似的问题。我只是删除了 .decode(),然后就得到了正确的结果。所以在你的情况下:

    self.sock.send(file_dir)
    self.sock.send(str(filesize))

0

你读取数据的方法不可靠,很可能在第一个recv中读取了比想要的更多的数据,在第二个recv中得到了非字符数据。TCP是一种流协议,仅因为你在单独的send()调用中发送了两个字符串并不意味着接收方会在单独的recv()调用中收到它们。

如果你正在发送不同的数据片段,你必须有某种方法来知道一个片段何时结束并且下一个片段何时开始。你的解决方案的规则构成了一个协议。

另请参见我的答案和其他内容,以可靠地读取恰好K字节。如果你的协议在每个片段前都带有该片段的长度,则此信息可能很有用。


哥们儿,我在发送文件大小时仍然遇到了UnicodeDecodeError错误。我真的不知道该怎么办...... - Tomer Cahal
也许我可以把代码文件发送给您,您可以看一下? - Tomer Cahal
我不明白,因为如果我事先发送大小,那么这也会导致连续两次发送。 - Tomer Cahal
发送的数量并不重要,重要的是接收你需要的字节而不是其他字节。 - President James K. Polk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接