2010-10-01 3 views
4

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

Я заметил проблему, когда пытался выполнить команду 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 

Что я делаю неправильно?

UPDATE

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

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

Можете ли вы запустить в отладчике, поставить точку перерыва при сравнении, а затем глубже взглянуть на строки с клиентом и перечислением? –

+0

Как вы переписываете свою строку? –

+0

@Rob - Мне бы хотелось, и это превращается в другой вопрос :) Это приложение для swing. У вас есть указатели на то, как я могу запустить отладчик? Я в основном работал над веб-приложениями, где я отлаживаю, подключаясь к tomcat. –

ответ

4

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

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

int bytesRead = in.read(commandBytes); 
String command = new String(commandBytes, 0, bytesRead); 
+0

Спасибо! Вот и все! –

3

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

byte[] commandBytes = new byte[1024]; 
int length = in.read(commandBytes); //in is a BufferedInputReader 
String command = new String(commandBytes, 0, length); 
2

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

 Смежные вопросы

  • Нет связанных вопросов^_^