【问题标题】:Comparing strings passed through socket UTF8比较通过套接字 UTF8 传递的字符串
【发布时间】:2020-04-05 21:53:32
【问题描述】:

我有一个有趣的问题。

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

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

从 Java 我发送“fillOpen”

在python中解码后打印“fillOpen”

问题:

在 Python 脚本中对解码后的字符串执行字符串比较总是会导致错误。我已经这样设置了:

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 应用字符串 comp 来工作?

谢谢你们。

【问题讨论】:

  • 你检查过你收到的字符串是什么字符吗?也许有一些尾随空格?
  • 我试过这个。字符串解码后将所有\t ' ' '\n' 替换为 ' ' 但无济于事。
  • 您使用的 Java 中的 writeUTF 方法是什么?这个? docs.oracle.com/javase/7/docs/api/java/io/…
  • 你能在对它执行任何操作之前显示从套接字读取的值的repr吗?

标签: java python sockets


【解决方案1】:

假设您使用的是 Java DataOutput 接口中定义的 writeUTF 方法:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2011-10-24
    • 1970-01-01
    • 2020-03-13
    • 2010-11-28
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多