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返回编码。 从我的踪迹中可以看出,它始终为空。