为什么Tomcat没有响应编码设置?我怎么处理它?

Dis*_*loo 5 java encoding tomcat servlets

我最近遇到了servlet生成的网站编码问题,如果servlet是在Tomcat下部署的,而不是在Jetty下部署的.我做了一些关于它的研究,并将问题简化为以下servlet:

public class TestServlet extends HttpServlet implements Servlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/plain");
        Writer output = response.getWriter();
        output.write("öäüÖÄÜß");
        output.flush();
        output.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在Jetty下部署它并将浏览器指向它,它将返回预期的结果.数据以ISO-8859-1的形式返回,如果我查看标题,则Jetty返回:

Content-Type: text/plain; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)

浏览器从此标头中检测编码.如果我在Tomcat中部署相同的servlet,浏览器会显示奇怪的字符.但Tomcat也将数据返回为ISO-8859-1,不同之处在于没有标题可以告诉它.所以浏览器必须猜测编码,这就出错了.

我的问题是,Tomcat的行为是正确还是错误?如果它是正确的,我该如何避免这个问题?当然,我总是可以添加response.setCharacterEncoding("UTF-8");到servlet,但这意味着我设置了一个固定的编码,浏览器可能会或可能不会理解.如果没有浏览器而另一个服务访问servlet,则问题更为相关.那么我应该如何以最灵活的方式处理问题呢?

Wil*_*ill -1

如果您没有指定编码,Tomcat 可以自由地对您的字符进行编码,无论您感觉如何,并且浏览器可以自由猜测 Tomcat 选择的编码。你是对的,解决问题的方法是response.setCharacterEncoding("UTF-8")

您不必担心浏览器可能无法理解编码,因为几乎过去 10 年来发布的所有浏览器都支持 UTF-8。不过,如果您真的担心,您可以检查用户代理提供的“Accept-Encoding”标头。

  • @Rasmus Kaj:Servlet 2.5 Spec,SRV.5.4:“如果 servlet 在调用 ServletResponse 接口的 getWriter 方法或提交响应之前未指定字符编码,则使用默认的 ISO-8859-1。” (2认同)