一个简单的HTML文件:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form method="POST" action="test.jsp" accept-charset="utf-8" method="post" enctype="application/x-www-form-urlencoded" >
<input type="text" name="P"/>
<input type="submit" value="subMit"/>
</form>
</body>
</html>
HTML文件由服务器使用标头Content-Type:text/html; charset=utf-8
提供。一切都说:“亲爱的浏览器,当你发布这个表格,请发布utf-8编码”。浏览器实际上是这样做的。输入字段中输入的每个值都将采用UTF-8编码。 但是浏览器不会告诉服务器这个! post请求的HTTP头将包含Content-Type:application/x-www-form-urlencoded
字段,但字符集将被省略(使用FF3.6和IE8进行测试)。
问题是我使用的应用程序服务器(Tomcat6)期望Content-Type标头中的字符集(如RFC2388中所述)。像这样:Content-Type:application/x-www-form-urlencoded;charset=utf-8
。如果省略字符集,它将采用ISO-8859-1,而不是用于编码的字符集。结果是数据损坏。
是否有人知道如何强制当前浏览器将charset附加到Content-Type标头?
答案 0 :(得分:11)
是否有人知道如何强制当前浏览器将charset附加到Content-Type标头?
不,没有浏览器提供charset
媒体类型的application/x-www-form-urlencoded
参数。更重要的是,定义该类型的HTML规范没有提出charset
参数,因此服务器无法合理地期望得到一个。
(对于charset
提交的子部分,HTML4 确实期望multipart/form-data
,但即使在这种情况下,也没有浏览器确实符合要求。)
接收字符集= “UTF-8”
accept-charset
在IE中被破坏,不应该使用。对于作为UTF-8的页面中的表单,它不会产生任何影响,但在其他情况下,它可能会导致不一致的结果。
不,使用表单你只需要以UTF-8的形式提供页面,结果应该以UTF-8的形式返回(没有识别标记告诉你(除了{{3但是Tomcat不支持它。)
因此,如果您不希望它回退到默认值(通常是错误的),您必须告诉Servlet容器用于参数的编码。在一组有限的情况下,您可以调用ServletRequest.setCharacterEncoding()
来执行此操作,但这往往很脆弱,并且对于从查询字符串中获取的参数根本不起作用。遗憾的是,没有标准化的Servlet级别修复。对于Tomcat,您通常必须_charset_
hack,而不是能够在应用程序中修复它。