【问题标题】:error UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte in Socket Programming错误UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0xff:套接字编程中的无效起始字节
【发布时间】:2021-05-30 23:12:01
【问题描述】:

你好,所以我一直在做 Python 套接字编程。我想要做的是向服务器发送一个名为“option”的字符串变量。

这是客户端代码

option = "4"
client.send(option.encode())

我收到“错误 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte”。

这是我的服务器代码。

option = client.recv(512).decode()

服务器中的选项应该收到一个值为“4”的字符串,但就像我说的那样,我得到了一个错误。 谁能知道如何解决这个问题?提前致谢。

【问题讨论】:

  • 您可以尝试通过添加'utf-8' 参数来明确您的encodedecode 调用。然后在recv之后检查len(option)
  • 我已经尝试添加utf-8,但它不起作用。
  • @oatty8867 - 您是否在客户端和服务器中都添加了显式编码?
  • 0xff 是 Microsoft UTF-16(有时是 UTF-8)编码的 BOM 的开始。您可以在客户端和服务器中调用locale.getpreferredencoding() 来查看它们当前正在使用什么。
  • 怎么做。我是新手。

标签: python sockets


【解决方案1】:

由于网络编程通常涉及可以具有不同编码的多台机器,因此应该为协议定义编码。它可以是每个人都必须使用的单一编码(如今这是一个非常好的选择),或者需要有一种方法来协商协议本身的编码。

在你的情况下,你可以硬编码:

option = "4"
client.send(option.encode(encoding="utf-8"))

option = client.recv(512).decode(encoding="utf-8")

这仍然有一个明显的错误。 recv 不会收到与发件人完全相同大小的东西。如果您的编码字符是 3 个字节,则接收器可能会收到部分字符。这意味着您需要某种方式来划分字符串,以便双方都知道给定字符或字符串的结束位置。但那是一锅不同的鱼。

有许多现有的协议可以处理消息边界、编码等。HTTP、XMLRPC、Zeromq 只是其中的一小部分。这比推出自己的解决方案要容易得多。

【讨论】:

  • 我按照您的建议对其进行了硬编码,但仍然出现错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 34: invalid start byte@tdelaney
  • 很抱歉听到这个消息。除了解码,您可以尝试print(client.recv(512)) 以便我们可以看到正在解码的全套八位位组吗?另外,在发送的机器上,print("4".encode("utf-8")) 是什么?它们应该匹配。
  • 我打印了print(client.recv(512)),所以它打印了非常长的编码字符串,所以我打印了print("4".encode("utf-8")),以检查编码“4”应该是什么,它只是一个b'4'。
  • 所以,您收到的不仅仅是“4”。那个长字节对象的开始是什么……比如说前 16 个字节?您显示的代码位只是“4”...如果您收到更多,那么您的代码的不同部分会发送额外的东西。您可能会获得字节顺序标记 (BOM),请参阅 wikipedia 了解各种 BOMS。它们通常在 microsoft 上使用。
【解决方案2】:

我想通了!所以我改变了这个

option = client.recv(512).decode()

到这里

option = client.recv(1).decode()

它成功了!所以我的结论是客户端试图向服务器发送一个字符串。 我要发送到服务器的是“4”,所以客户端尝试发送的块大小是 1。

我不确定,但这对我有用。

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 2021-12-01
    • 2016-05-13
    • 2018-03-14
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    相关资源
    最近更新 更多