我的开发环境(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和8),我也尝试在Tomcat连接器(URIEncoding)中指定字符集,甚至作为JVM参数,但这似乎没有任何区别。
当上面的代码执行时,我检查了默认字符集,它是windows-1252,这就是我在InputStreamReader构造函数中指定UTF-8的原因,不知道它在我们的服务器上是如何工作的。 request.getCharacterEncoding()也返回utf-8。
有没有人有任何想法?提前感谢您的帮助。
答案 0 :(得分:1)
由于可以设置请求和响应的编码,我的猜测是响应缺少
response.setEncoding("UTF-8");
因此使用HTTP默认编码ISO-8859-1(Latin-1),它有点是Windows-1252(Windows Latin-1)的子集。
在某种程度上,这两个错误相互取消了Windows-1252。
但请检查压缩文本是否确实是UTF-8。
答案 1 :(得分:0)
看起来我需要用“-Dfile.encoding = UTF-8”来启动JVM,这就是诀窍。我认为实际的String对象仍然被编码为windows默认值,所以一旦从流中读取,编码就搞砸了。字符串仍然可以很好地打印到控制台,但是当我检查Unicode点时,出现了错误的字符。
答案 2 :(得分:0)
对于POST请求,需要调整web.xml并且需要包含编码过滤器(如How to get UTF-8 working in Java webapps?中所述)。
同样在大多数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拥有工作区文件夹中所有配置文件的副本。