我遇到了一个问题,在我的开发环境(NetBeans和本地Tomcat安装(中,字符编码的工作方式与我们的服务器不同。我们使用Tomcat作为服务器端servlet和Java客户端。
在服务器端,此代码在我的机器上本地工作:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
...
java.util.zip.InflaterInputStream zipIn = new java.util.zip.InflaterInputStream(request.getInputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(zipIn, "UTF-8"));
String line = in.readLine(); // correctly encoded String
...
}
然而,在实际的服务器上,指定字符集会破坏代码,并且只能像这样工作:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
...
java.util.zip.InflaterInputStream zipIn = new java.util.zip.InflaterInputStream(request.getInputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(zipIn));
String line = in.readLine(); // correctly encoded String
...
}
我尝试过不同版本的Tomcat(7和8(和不同版本的Java(7和7(,我也尝试过在Tomcat连接器中指定字符集(URIEncoding(,甚至作为JVM参数,但这些似乎都没有什么不同。
当上面的代码执行时,我已经检查了默认的字符集,它是windows-1252,这就是为什么我在InputStreamReader构造函数中指定UTF-8,不知道这在我们的服务器上是如何工作的。request.getCharacterEncoding((也返回utf-8。
有人有什么想法吗?提前感谢您的帮助。
看起来我需要用"-Dfile.concoding=UTF-8"启动JVM,这就成功了。我认为实际的String对象仍然被编码为windows默认值,所以一旦从流中读取,编码就变得一团糟。字符串仍然可以很好地打印到控制台,但当我检查Unicode点时,出现了错误的字符。
由于可以设置请求和响应的编码,我猜测响应缺少
response.setEncoding("UTF-8");
因此使用HTTP默认编码ISO-8859-1(Latin-1(,它在某种程度上是Windows-1252(WindowsLatin-1的子集(。
这是Windows-1252的两个错误。
但请检查压缩文本是否确实是UTF-8。
同样对于POST请求,需要调整web.xml并包含编码过滤器(如"如何在Java web应用程序中使用UTF-8?"中所述(。
同样在大多数tomcat 7+版本中,所需的过滤器已经包含在内,只需通过取消以下行的注释即可激活:
1。
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
2。
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在eclipse中使用tomcat时,请确保在/Servers文件夹而不是安装目录中进行调整。Eclipse在工作区文件夹中有所有配置文件的副本。