2012-01-17 7 views
9

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

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

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

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

РЕДАКТИРОВАТЬ:

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

+0

сообщение, что прилагается? –

+0

Я отредактировал вопрос .. – HashimR

ответ

9

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

+0

Мне также нужно установить тип содержимого ответа? – HashimR

+0

@HashimR - Конечно, это не повредит. Приемник также должен быть записан для изучения типа содержимого для спецификации кодировки и почитания. (Если оба конца находятся под вашим контролем, вы можете обрезать некоторые углы здесь без видимого вреда. Но я бы посоветовал это, потому что он просто создает захороненную наземную шахту, которая взорвется в будущем, когда один конец будет «обновлен».) –

+0

Итак, что я получаю из вашего вышеприведенного комментария, так это то, что тип контента не должен быть установлен, так как это повлияет на масштабируемость программы. Достаточно использовать только '' xyz '.getBytes («UTF-8») '. Правильно ли я понял? :) – HashimR

2

Ошибка вы видите здесь, потому что сервер по умолчанию 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() в Servlet, чтобы получить запись, которая будет автоматически использовать согласованную кодировку. Обратите внимание, что вы не можете просто выводить байты, так как сервер и клиент могут договориться о другой кодировке передачи для потока HTTP!

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