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

Edu*_*rch 12 forms post tomcat 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>
Run Code Online (Sandbox Code Playgroud)

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标头?

bob*_*nce 11

是否有人知道如何强制当前浏览器将charset附加到Content-Type标头?

不,没有浏览器曾提供过媒体类型的charset参数application/x-www-form-urlencoded.更重要的是,定义该类型的HTML规范没有提出charset参数,因此服务器无法合理地期望得到一个参数.

(HTML4 确实期望提交charset的子部分multipart/form-data,但即使在这种情况下,也没有浏览器实际符合.)

接收字符集= "UTF-8"

accept-charset在IE中被破坏,不应该使用.对于作为UTF-8的页面中的表单,它不会产生任何影响,但在其他情况下,它最终会产生不一致的结果.

不,用表格你就必须成为他们在为UTF-8是网页,结果应该回来为UTF-8(无识别标志,告诉你,(除了潜在的_charset_黑客攻击,但没有按Tomcat的"支持那个).

因此,如果您不希望它回退到默认值(通常是错误的),您必须告诉Servlet容器用于参数的编码.在一组有限的情况下,您可以调用ServletRequest.setCharacterEncoding()此方法,但这往往很脆弱,并且对于从查询字符串中获取的参数根本不起作用.遗憾的是,没有标准化的Servlet级别修复.对于Tomcat,您通常需要使用server.xml,而不是能够在应用程序中修复它.

  • 不,我的意思是HTML规范:HTTP规范没有说明表单数据如何编码到请求体中.RFC2616中对ISO-8859-1的引用仅适用于定义`charset`参数的"某些媒体类型"; "application/x-www-form-urlencoded"和"multipart/form-data"都没有定义一个,因此该规则不会影响表单提交.`form-urlencoded`甚至不包含任何直接高字节,只有'%` - 编码版本相同,所以即使有一个`charset`参数,它也不会受到影响. (2认同)
  • 同时`multipart`子部分'头文件的内容不受RFC2616的影响,而是受普通MIME头规则的影响; 它应该可以根据RFC2388(定义`multipart/form-data`)来指定子部分的编码,但没有浏览器这样做,很少有服务器甚至会费心去寻找它.(如果你尝试的话,奇怪的会破坏,这就是为什么没有浏览器增加对它的支持.) (2认同)