2012-01-17 16 views
9

Ho un'applicazione client che sta inviando una richiesta a un server. Il server sta recuperando un campo da un database e inviando una risposta java.lang.String al client. Il server è in esecuzione su JBoss v5.0. La cosa insolita è che, quando il server è in esecuzione su una macchina Windows, la risposta ricevuta dal client è normale, ma quando è in esecuzione su Linux c'è qualche problema nella codifica.Un carattere speciale viene aggiunto prima del §

Questi sono i dati nel database: "INET§IMPNG\n"

risposta viene ricevuto correttamente quando il server in esecuzione su Windows.

Un carattere speciale viene aggiunto prima dello § quando il server è in esecuzione su Linux. C'è qualcosa di speciale che devo fare sul lato server. Qualsiasi aiuto sarebbe apprezzato.

EDIT:

La risposta ricevuta è: INET§IMPNG.

+0

post cosa viene aggiunto? –

+0

Ho modificato la domanda .. – HashimR

risposta

9

Questo è quasi certamente un problema di codifica dei caratteri. Per evitare discrepanze tra client e server, specificare sempre una codifica specifica ed evitare la codifica predefinita. (Ad esempio, invece di "xyz".getBytes("UTF-8")

+0

devo anche impostare il tipo di contenuto della risposta? – HashimR

+0

@ HashimR - Di certo non può far male. Il ricevitore dovrebbe anche essere scritto per esaminare il tipo di contenuto per una specifica del set di caratteri e onorarlo. (Se entrambe le estremità sono sotto il tuo controllo, puoi tagliare qui alcuni angoli senza apparente danno, ma ti sconsiglio di farlo perché crea solo una miniera sepolta che esploderà in futuro quando una estremità verrà "potenziata".) –

+0

Quindi quello che ottengo dal tuo commento sopra è che il tipo di contenuto non dovrebbe essere impostato in quanto avrebbe effetto sulla scalabilità del programma. Solo usando '" xyz ".getBytes (" UTF-8 ")' è sufficiente per ora. Ho capito bene? :) – HashimR

2

L'errore che si sta verificando qui è perché il server Linux ha come impostazione predefinita l'invio di String come UTF-8. In UTF-8, i caratteri ASCII regolari sono codificati come un singolo byte. Il carattere § è codificato come due byte. Se si decodificare questo usando CP-1252, si vedrà § perché i due byte vengono interpretati come due caratteri separati.

Il server Windows userà http://en.wikipedia.org/wiki/Windows-1252, che può codificare il § come un singolo byte

Se si utilizza il proprio protocollo, è necessario specificare quale codifica dei caratteri utilizzare sul filo. ault to UTF-8 (standard internet). Quando si invia la stringa, è necessario utilizzare "xyz".getBytes("UTF-8"). Se si riceve la stringa, è necessario utilizzare new String(bytes, "UTF-8").

Se si utilizza HTTP, il client deve rispettare le intestazioni nella sezione 14 della specifica HTTP. Vi propongo di utilizzare un client HTTP implementato come Apache Commons HTTPClient o quello integrato J2SE. Sul lato server, è necessario utilizzare il metodo response.getWriter() nel servlet per ottenere un writer che utilizzerà automaticamente la codifica concordata. Si noti che non è possibile emettere solo byte, poiché il server e il client potrebbero aver concordato un'altra codifica di trasferimento per lo stream HTTP!

Problemi correlati