servlet是否知道使用http-equiv指定的已发送表单的编码?

servlet是否知道使用http-equiv指定的已发送表单的编码?

当我使用http-equiv指定POSTed表单的编码时:

     

然后在servlet我使用方法, request.getCharacterEncoding()我得到了null ! 那么,有没有办法可以告诉服务器我在一些字符编码中编码数据?

这确实会从大多数webbrowsers返回null 。 但通常你可以放心地假设webbrowser 实际上使用了原始响应头中指定的编码,在本例中为gb2312 。 一种常见的方法是创建一个Filter来检查请求编码,然后使用ServletRequest#setCharacterEncoding()来强制所需的值(当然,您应该在整个Web应用程序中使用该值)。

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { if (request.getCharacterEncoding() == null) { request.setCharacterEncoding("gb2312"); } chain.doFilter(request, response); } 

将此Filter映射到覆盖所有servlet请求的url-pattern ,例如/*

如果你没有这样做并放手,那么servletcontainer将使用其默认编码来解析参数,这通常是ISO-8859-1 ,而这又是错误的。 您对相宜本草输入相宜本草会像ÏàÒ˱¾²Ý

在GB2312中发送POST数据是不可能的。 我认为UTF-8是W3C的推荐,所有新浏览器只能以Latin-1或UTF-8发回数据。

我们能够在Win 95上的旧IE中获取GB2312编码数据,但在基于Unicode的新浏览器上通常是不可能的。

在Firefox上查看此测试,

 POST / HTTP/1.1 Host: localhost:1234 User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 46 

我的页面在GB2312中,我在任何地方都指定了GB2312,但Firefox只是忽略它。

一些破碎的浏览器甚至用Latin-1编码中文。 我们最近添加了一个具有已知值的隐藏字段。 通过检查值,我们可以计算出编码。

request.getCharacterEncoding()从Content-Type返回编码。 从我的踪迹中可以看出,它始终为空。