如何强制浏览器在内容类型的http标头中设置charset

时间:2010-03-10 17:13:40

标签: tomcat forms post content-type character-encoding

一个简单的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标头?

1 个答案:

答案 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,而不是能够在应用程序中修复它。