java - 比较通过套接字 UTF8 传递的字符串

标签 java python sockets

我这里有一个有趣的问题。

首先我有一个 Java 的 UI。 UI 在某一时刻通过套接字连接到网络上的 rpi4。从那里使用 .writeUTF(string) 通过套接字发送数据。

在 rpi4 方面,我正在运行一个简单的 Python 3 脚本。它的唯一目的是吐出 socket 上的任何东西,而且它确实吐出了。但在此之前,我使用recv.decode('utf-8') 来解码字符串。

我从 Java 发送“fillOpen”

在Python中解码后打印“fillOpen”

问题:

在 python 脚本中对解码后的字符串执行字符串比较始终会导致 false。我已经这样设置了:

Command = recv.decode('utf-8')
If Command == "fillOpen":
  #Do work

我还尝试不解码字符串并与编码字符串进行比较。因此:

Command = recv
FillOpenCommand = 
("fillOpen").encode('utf-8')
If fillOpenCommand == Command:
#Do work

这些比较都不会得出正确的结果。

我读到 Java writeUTF 是 UTF8 编码,但略有“不同”?

我可以调整 .writeUTF 以与 Python 3 解码器一起使用吗?是否有另一种方法可以发送可解析的数据,然后通过 Python 应用字符串比较?

谢谢大家。

最佳答案

假设您正在使用 Java DataOutput 接口(interface)中定义的 writeUTF 方法:

writeUTF 的输出以两个字节的长度信息开始。您可以跳过它,也可以使用它来确保您收到完整的消息。

最简单的方法就是跳过它:

Command = recv[2:].decode('utf-8')

如果您的命令只是 ASCII 并且不包含用户输入、表情符号、乐谱等内容,那么这已经足够了。否则,你仍然有问题。 writeUTF 处理“代理对”字符的方式不是有效的“utf-8”,并且 decode('utf-8') 将抛出 UnicodeDecodeError.如果我是您,在这种情况下,我会停止使用 writeUTF 并开始使用生成标准 UTF-8 编码数据的方法。

关于java - 比较通过套接字 UTF8 传递的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61027943/

相关文章:

JavaFX 按钮 minWidth 被忽略

java - 生成字符串排列组合的智能方式

Windows 上的 Python Matplotlib : Issue on updating matplotlib to 3. 1.2

python - 懒惰地设置字典

python - 如何从较大的字符串中减去已知的子字符串

c++ - 哪些 Boost.Asio 调用返回哪些 Boost 错误代码/条件?

java - 数据表中生成的标记

c# - 与非托管代码相比,在 TCP/UDP 套接字上读取/写入大量数据时托管代码是否存在性能损失?

objective-c - 在 Macos High Sierra 上创建和绑定(bind)套接字

java - 运行构建器时出错 'Java Builder '