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”标头。
| 归档时间: |
|
| 查看次数: |
7344 次 |
| 最近记录: |