一个简单的 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 提供;字符集=utf-8
。一切都在说:“亲爱的浏览器,当您发布此表单时,请将其发布为 utf-8 编码”。浏览器实际上是这样做的。输入字段中输入的每个值都将采用 UTF-8 编码。 但是 浏览器不会将此告诉服务器!发布请求的 HTTP header 将包含一个 Content-Type:application/x-www-form-urlencoded
字段,但字符集将被省略(已通过 FF3.6 和 IE8 测试)。
问题是我使用的应用程序服务器 (Tomcat6) 需要 Content-Type header 中的字符集(如 RFC2388 中所述)。像这样:Content-Type:application/x-www-form-urlencoded;charset=utf-8
。如果省略字符集,它将采用 ISO-8859-1,这不是用于编码的字符集。结果是损坏的数据。
有人知道如何强制当前浏览器将字符集附加到 Content-Type header 吗?
最佳答案
Does some one have a clue how to force the current browsers to append the charset to the Content-Type header?
不,没有浏览器提供过带有application/x-www-form-urlencoded
媒体类型的charset
参数。更重要的是,定义该类型的 HTML 规范没有提出 charset
参数,因此服务器不能合理地期望得到一个参数。
(HTML4 确实期望 multipart/form-data
提交的子部分有一个 charset
,但即使在那种情况下实际上也没有浏览器符合。)
accept-charset="utf-8"
accept-charset
在 IE 中被破坏,不应使用。对于以 UTF-8 格式提供的页面中的表单,这两种方式都不会产生影响,但在其他情况下,它可能会导致结果不一致。
不,对于表单,您只需将它们所在的页面作为 UTF-8 格式提供,结果应该以 UTF-8 格式返回(没有识别标记告诉您这一点(_charset_
hack 可能除外) ,但 Tomcat 不支持)。
因此,如果您不想让 Servlet 容器恢复为默认值(这通常是错误的),则必须告诉 Servlet 容器对参数使用什么编码。在一组有限的情况下,您可以调用 ServletRequest.setCharacterEncoding()
来执行此操作,但这往往很脆弱,并且对于从查询字符串中获取的参数根本不起作用。遗憾的是,没有针对此的标准化 Servlet 级修复。对于 Tomcat,您通常必须 muck about with the server.xml而不是能够在应用程序中修复它。
关于tomcat - 如何强制浏览器在内容类型 http header 中设置字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2418944/