Сравнение строк, пропущенных через сокет UTF8 - PullRequest
0 голосов
/ 04 апреля 2020

У меня здесь интересная проблема.

Сначала у меня есть пользовательский интерфейс в Java. Пользовательский интерфейс в одной точке подключается к rpi4 в сети через сокет. Оттуда данные отправляются через сокет с использованием .writeUTF (строка).

На стороне rpi4 я запускаю простой Python 3 скрипт. Его единственная цель состоит в том, чтобы выплевывать все, что приходит через сокет, и это происходит. Но перед этим я использую recv.decode ('utf-8') для декодирования строки.

С Java Я отправляю "fillOpen"

In 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, который будет работать?

Спасибо, ребята.

1 Ответ

0 голосов
/ 05 апреля 2020

Предполагается, что вы используете метод writeUTF, определенный в интерфейсе Java DataOutput:

Выходные данные writeUTF начинаются с двух байтов информации о длине. Вы можете пропустить его или использовать его, чтобы убедиться, что вы получили полное сообщение.

Самое простое, что можно сделать, это пропустить его:

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

Если ваши команды просто ASCII и не содержит таких вещей, как пользовательский ввод, смайлики, музыкальные записи, это достаточно хорошо. В противном случае у вас все еще есть проблема. Способ writeUTF обработки символов «суррогатная пара» недопустим «utf-8», и decode('utf-8') выдаст UnicodeDecodeError. Если бы я был вами, в этом случае я бы прекратил использовать writeUTF и начал бы использовать методы, которые производят стандартные данные в кодировке UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...