一尘不染

如何强制浏览器在内容类型的HTTP标头中设置字符集

tomcat

一个简单的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文件由服务器使用header提供Content-Type:text/html; charset=utf-8。一切都说:“亲爱的浏览器,当您发布此表单时,请发布为utf-8编码”。浏览器实际上是这样做的。在输入字段中输入的每个值都将采用UTF-8编码。
但是 浏览器不会告诉服务器!发布请求的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不是用于编码的字符集。结果是损坏的数据。

有人知道如何强制当前浏览器将字符集附加到Content-Type标头吗?


阅读 271

收藏
2020-06-16

共1个答案

一尘不染

有人知道如何强制当前浏览器将字符集附加到Content-Type标头吗?

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

(HTML4 确实 希望提交charset的子部分为a multipart/form-data,但即使在这种情况下,也没有浏览器实际遵守。)

accept-charset =“ utf-8”

accept- charset在IE中已损坏,因此不应使用。对于用作UTF-8的页面中的表单,这两种方法都没有任何区别,但是在其他情况下,最终结果可能会不一致。

不,对于表格,您只需要以UTF-8的形式提供它们所在的页面,然后结果应以UTF-8的形式返回(没有识别标记可以告诉您(除了可能的_charset_hack,但Tomcat不会)不支持这一点)。

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

2020-06-16