Python 错误UnicodeDecodeError:&x27;utf-8';编解码器可以';在位置0处对字节0xff进行解码:套接字编程中的起始字节无效
你好,我一直在做Python套接字编程。我要做的是向服务器发送一个名为“option”的字符串变量 这是客户端代码Python 错误UnicodeDecodeError:&x27;utf-8';编解码器可以';在位置0处对字节0xff进行解码:套接字编程中的起始字节无效,python,sockets,Python,Sockets,你好,我一直在做Python套接字编程。我要做的是向服务器发送一个名为“option”的字符串变量 这是客户端代码 option = "4" client.send(option.encode()) 我收到“错误UnicodeDecodeError:'utf-8'编解码器无法解码位置0中的字节0xff:无效的开始字节” 这是我的服务器代码 option = client.recv(512).decode() 服务器中的选项应该收到一个值为“4”的字符串,但正如我所说,我得
option = "4"
client.send(option.encode())
我收到“错误UnicodeDecodeError:'utf-8'编解码器无法解码位置0中的字节0xff:无效的开始字节”
这是我的服务器代码
option = client.recv(512).decode()
服务器中的选项应该收到一个值为“4”的字符串,但正如我所说,我得到了一个错误。
有人知道怎么解决这个问题吗?提前感谢。由于网络编程通常包含多台可以有不同编码的机器,因此应该为协议定义编码。它可以是每个人都必须使用的单一编码(如今这是一个非常好的选择),也可以是协议本身中需要协商编码的方法 在您的情况下,您可以对其进行硬编码:
option = "4"
client.send(option.encode(encoding="utf-8"))
及
这仍然有一个明显的错误。recv接收的内容与发件人的大小不完全相同。如果您的编码字符是(比如)3个字节,则接收器可能会接收到部分字符。这意味着您需要某种方法对字符串进行去标记,以便双方都知道给定字符或字符串的结尾。但那是另一回事
有许多现有协议用于处理消息边界、编码等。HTTP、XMLRPC、Zeromq只是其中的一些。这些可能比推出自己的解决方案要容易得多。我想出来了!所以我改变了
option = client.recv(512).decode()
对此
option = client.recv(1).decode()
成功了!所以我的结论是客户端试图向服务器发送字符串。
我想要发送到服务器的是“4”,所以客户端尝试发送的块大小是1
我不确定,但这对我有效。您可以通过添加
'utf-8'
参数,尝试显式地使用编码
和解码
调用。然后在recv
之后选中len(选项)
。我尝试添加utf-8
,但没有效果。@oatty8867-是否在客户端和服务器中都添加了显式编码?0xff
是Microsoft utf-16(有时是utf-8)编码的BOM表的开始。您可以在客户端和服务器中调用locale.getpreferredencoding(),查看它们当前正在使用的内容。如何操作。我不熟悉这一点。我按照您的建议硬编码了它,但它仍然有一个错误UnicodeDecodeError:“utf-8”编解码器无法解码第34位的字节0xff:无效的开始字节
@tdelaney很抱歉听到这个消息。您可以尝试打印(client.recv(512))而不是解码,这样我们就可以看到正在解码的全套八位字节了吗?另外,在进行发送的机器上,什么是打印(“4”。编码(“utf-8”)
?它们应该匹配。我打印了print(client.recv(512))
所以它打印了非常长的编码字符串,所以我打印了print(“4.encode”(“utf-8”)
来检查编码“4”应该是什么,它只是一个b'4。所以,你不仅仅收到了“4”。长字节对象的开始是什么。。。说前16个字节?您显示的代码位仅为“4”。。。如果你收到更多的信息,那么你的代码会有不同的部分发送额外的信息。您可能会得到一个字节顺序标记(BOM),有关各种BOM,请参阅。它们通常在microsoft上使用。
option = client.recv(1).decode()