tomcat - 如何强制浏览器在内容类型 http header 中设置字符集

标签 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 文件由服务器使用 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/

相关文章:

php - 通过表单 PHP 保护用户输入

javascript - 将多个变量传递到 jquery 对话框表单

iphone - 用希伯来语将 JSON 从 iPhone 发送到 IIS,字符串在结尾前被剪切

post - 如何通过 POST 处理 S3 浏览器上传中的错误

jquery - 在 MVC 4 中将多个参数传递给操作时,困惑是使用 GET 还是 POST

eclipse - Tomcat使用Eclipse、JRebel、Spring Boot启动失败

eclipse - Gradle Tomcat插件-静态资源热部署

javascript - 从表单javascript传递变量值

tomcat - 如何在 IntelliJ 的远程 Tomcat 运行配置中启用 Perform on 'Update' 操作选项?

session - 是否可以与多个浏览器窗口共享一个 HttpSession 对象?