我有一个客户端应用程序正在向服务器发送请求。服务器从数据库中获取字段并将java.lang.String
响应发送回客户端。服务器在JBoss v5.0上运行。不寻常的是,当服务器在Windows机器上运行时,客户端收到的响应是正常的,但是当它在Linux上运行时,编码中存在一些问题。
这是数据库中的数据:"INET§IMPNG\n"
在Windows上运行服务器时,会正确收到响应。
当服务器在Linux上运行时,§
之前会附加一个特殊字符。我需要在服务器端做什么特别的事情。任何帮助将不胜感激。
修改
收到的回复是:INET§IMPNG
。
答案 0 :(得分:9)
这几乎可以肯定是一个字符编码问题。为避免客户端和服务器之间的不匹配,请始终指定特定编码并避免使用默认编码。 (例如,使用"xyz".getBytes()
"xyz".getBytes("UTF-8")
答案 1 :(得分: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,您的客户端应该遵守HTTP规范第14节中的标头。我建议你使用像Apache Commons HTTPClient或内置J2SE一样的实现HTTP客户端。在服务器端,您应该使用Servlet中的response.getWriter()
方法来获取将自动使用约定编码的编写器。请注意,您不能只输出字节,因为服务器和客户端可能已同意HTTP流的另一个传输编码!