Как выполнить независимое от кодирования сравнение строк в Java? - PullRequest
4 голосов
/ 01 октября 2010

У меня странная проблема со сравнением строк.Я отправляю строку на мой сервер (в байтах, используя getBytes()) от клиента.Я гарантировал, что кодировка на клиенте и сервере одинакова, запустив их оба с -Dfile.encoding=UTF-8.

. Я заметил проблему, когда пытался выполнить valueOf для строки, полученной отклиент, чтобы преобразовать его в перечисление.Когда я распечатываю строки, они выглядят точно одинаково.Но когда я выполняю compareTo, я получаю ненулевое число и equals возвращает false.

Я предполагаю, что это проблема кодирования.Хотя я не совсем уверен - я все еще новичок, когда дело доходит до программирования клиент-сервер с сокетами.

Вот что я получаю:

Waiting for connections on port 9090
Connected to client: 127.0.0.1
received command: GetAllItems
The value is |GetAllItems| (from client)
The value is |GetAllItems| (from enum)
equals: false

Что я делаю не так?

ОБНОВЛЕНИЕ

Вот как я восстанавливаю строку из потока.Возможно, здесь я что-то не так делаю?

byte[] commandBytes = new byte[1024];
in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes);

Ответы [ 3 ]

4 голосов
/ 01 октября 2010

Я предполагаю, что, поскольку ваш буфер больше, чем ваша строка, в восстановленной строке добавляются нули. Допустимо, чтобы пустые значения были встроены в строки в Java (в отличие от C и компании), хотя Java обрабатывает их иначе, чем стандартный UTF-8.

Попробуйте записать прочитанную длину и передайте эту длину строковому конструктору:

int bytesRead = in.read(commandBytes);
String command = new String(commandBytes, 0, bytesRead);
3 голосов
/ 01 октября 2010

Ваша проблема в том, как вы строите строку.Вы читаете в байтах в буфер длиной 1024, но не говорите конструктору String смотреть только на соответствующие точки.Итак, ваш код должен быть ...

byte[] commandBytes = new byte[1024];
int length = in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes, 0, length);
2 голосов
/ 02 февраля 2012

Используйте java.text.Collator для сравнения строк.

...