Tomcat字符编码在服务器和本地开发之间的工作方式不同

时间:2015-07-06 16:52:03

标签: java tomcat netbeans encoding utf-8

我的开发环境(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。

有没有人有任何想法?提前感谢您的帮助。

3 个答案:

答案 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拥有工作区文件夹中所有配置文件的副本。