2012-01-17 12 views
9

Tengo una aplicación de cliente que está enviando una solicitud a un servidor. El servidor está obteniendo un campo de una base de datos y enviando una respuesta java.lang.String al cliente. El servidor se está ejecutando en JBoss v5.0. Lo inusual es que, cuando el servidor se ejecuta en una máquina con Windows, la respuesta que recibe el cliente es normal, pero cuando se ejecuta en Linux existe algún problema en la codificación.Se adjunta un carácter especial antes de §

Estos son los datos en la base de datos: "INET§IMPNG\n"

respuesta se recibe correctamente cuando el servidor se ejecuta en Windows.

Se agrega un carácter especial antes de § cuando el servidor se ejecuta en Linux. ¿Hay algo especial que deba hacer en el lado del servidor? Cualquier ayuda sería apreciada.

EDIT:

La respuesta recibida es: INET§IMPNG.

+0

publicar lo que se anexa? –

+0

He editado la pregunta ... – HashimR

Respuesta

9

Esto es casi seguro un problema de codificación de caracteres. Para evitar desajustes entre el cliente y el servidor, siempre especifique una codificación específica y evite la codificación predeterminada. (Así, por ejemplo, en lugar de "xyz".getBytes(), utilice "xyz".getBytes("UTF-8")

+0

¿También necesito establecer el tipo de contenido de respuesta? – HashimR

+0

@HashimR - Ciertamente no puede doler. El receptor también debe escribirse para examinar el tipo de contenido para una especificación de juego de caracteres y honrarlo. (Si ambos extremos están bajo su control, puede cortar algunas esquinas aquí sin daño aparente. Pero desaconsejaría eso porque simplemente crea una mina terrestre enterrada que explotará en el futuro cuando se "actualiza" un extremo). –

+0

Entonces, lo que obtengo de su comentario anterior es que el tipo de contenido no debe establecerse ya que afectaría la escalabilidad del programa. Solo usando '" xyz ".getBytes (" UTF-8 ")' es suficiente por ahora. ¿Lo entendí bien? :) – HashimR

2

El error que está viendo aquí es porque los valores predeterminados del servidor Linux para el envío de la cadena como UTF-8. En UTF-8, los caracteres ASCII normales se codifican como una sola byte. El carácter § se codifica como dos bytes. Si decodifica esto utilizando CP-1252, verá § porque los dos bytes se interpretan como dos caracteres separados.

El servidor de Windows utilizará http://en.wikipedia.org/wiki/Windows-1252, que puede codificar § como un solo byte

Si está utilizando su propio protocolo, debe especificar qué codificación de caracteres usar sobre el cable. Le sugiero que def ault a UTF-8 (estándar de internet). Al enviar la cadena, debe usar "xyz".getBytes("UTF-8"). Si recibe la cadena, debe usar new String(bytes, "UTF-8").

Si está utilizando HTTP, su cliente debe respetar los encabezados en la sección 14 de la especificación HTTP. Propongo que uses un cliente HTTP implementado como Apache Commons HTTPClient o el integrado J2SE one. En el lado del servidor, debe usar el método response.getWriter() en el servlet para obtener un escritor que utilizará automáticamente la codificación acordada. Tenga en cuenta que no puede simplemente dar salida a bytes, ya que el servidor y el cliente pueden haber acordado otra codificación de transferencia para la transmisión HTTP.

Cuestiones relacionadas