Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 错误UnicodeDecodeError:&x27;utf-8';编解码器可以';在位置0处对字节0xff进行解码:套接字编程中的起始字节无效_Python_Sockets - Fatal编程技术网

Python 错误UnicodeDecodeError:&x27;utf-8';编解码器可以';在位置0处对字节0xff进行解码:套接字编程中的起始字节无效

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”的字符串,但正如我所说,我得

你好,我一直在做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(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()