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



我遇到了一个问题,在我的开发环境(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在工作区文件夹中有所有配置文件的副本。

相关内容

  • 没有找到相关文章

最新更新