Специальный символ добавляется перед § - PullRequest
9 голосов
/ 17 января 2012

У меня есть клиентское приложение, которое отправляет запрос на сервер. Сервер извлекает поле из базы данных и отправляет ответ java.lang.String клиенту. Сервер работает на JBoss v5.0. Необычно то, что, когда сервер работает на компьютере с Windows, ответ, полученный клиентом, является нормальным, но когда он работает на Linux, возникает некоторая проблема в кодировке.

Это данные в базе данных: "INET§IMPNG\n"

Ответ получен правильно, когда сервер работает в Windows.

Специальный символ добавляется перед §, когда сервер работает в Linux. Есть ли что-то особенное, что мне нужно сделать на стороне сервера. Любая помощь будет оценена.

EDIT:

Ответ получен: INET§IMPNG.

Ответы [ 2 ]

9 голосов
/ 17 января 2012

Это почти наверняка проблема кодировки символов. Чтобы избежать несоответствий между клиентом и сервером, всегда указывайте определенную кодировку и избегайте кодировки по умолчанию. (Так, например, вместо "xyz".getBytes() используйте "xyz".getBytes("UTF-8")

2 голосов
/ 17 января 2012

Ошибка, которую вы видите здесь, заключается в том, что сервер Linux по умолчанию отправляет строку как UTF-8.В UTF-8 обычные символы ASCII кодируются одним байтом.Символ § кодируется как два байта.Если вы декодируете это с помощью CP-1252, вы увидите §, потому что два байта интерпретируются как два отдельных символа.

Сервер Windows будет использовать http://en.wikipedia.org/wiki/Windows-1252,, который может кодировать § как одинбайт.

Если вы используете свой собственный протокол, вы должны указать, какую кодировку символов использовать по проводам.Я предлагаю вам по умолчанию UTF-8 (интернет-стандарт).При отправке строки вы должны использовать "xyz".getBytes("UTF-8").Если вы получаете строку, вы должны использовать new String(bytes, "UTF-8").

Если вы используете HTTP, ваш клиент должен соблюдать заголовки в разделе 14 спецификации HTTP.Я предлагаю вам использовать реализованный HTTP-клиент, такой как Apache Commons HTTPClient, или встроенный J2SE.На стороне сервера вы должны использовать метод response.getWriter() в Сервлете, чтобы получить средство записи, которое будет автоматически использовать согласованную кодировку.Обратите внимание, что вы не можете просто выводить байты, поскольку сервер и клиент могли договориться о другой кодировке передачи для потока HTTP!

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