accept-charset="UTF-8" 参数在表单中使用时不执行任何操作

Posted

技术标签:

【中文标题】accept-charset="UTF-8" 参数在表单中使用时不执行任何操作【英文标题】:accept-charset="UTF-8" parameter doesnt do anything, when used in form 【发布时间】:2012-10-01 14:03:12 【问题描述】:

我在表单中使用了 accept-charset="utf-8" 属性,发现当使用非 ascii 进行表单发布时,标头在请求标头中有不同的接受字符集选项。我有什么遗漏吗?我的表格是这样的

<form method="post" action="controller" accept-charset="UTF-8">
..input text box
.. submit button
</form>

提前致谢

【问题讨论】:

您尝试过哪些用户代理?你看any of the related links了吗? 【参考方案1】:

所问的问题是自相矛盾的:标题说accept-charset 参数没有做任何事情,而问题主体说当使用accept-charset 属性(这是正确的术语)时, “标头在请求标头中有不同的接受字符集选项”。我想后一个陈述中缺少一个否定。

浏览器根据自己的原则和设置在HTTP请求头中发送Accept-Charset参数。例如,我的 Chrome 发送Accept-Charset:windows-1252,utf-8;q=0.7,*;q=0.3。服务器端软件通常会忽略这样的标头,但它可以用于(并且它被设计用于)确定在服务器响应中使用哪种编码,以防服务器端软件(表单处理程序,在这种情况下)能够在响应中使用不同的编码。

form 元素中的 accept-charset 属性预计不会影响 HTTP 请求标头,它也不会。它旨在指定用于请求中表单数据的字符编码,这就是它的实际作用。 html 4.01 spec is obscure 与此有关,但 W3C HTML5 draft puts it 更好,尽管出于某些奇怪的原因使用复数:“给出用于提交的字符编码”。我想原因是您可以指定备用编码,以准备浏览器无法使用您首选编码的情况。例如,在 Chrome 中实际发生的情况是,如果您使用 accept-charset="foobar utt-8",则使用 UTF-8。

在实践中,该属性用于使数据提交的编码与包含表单的页面的编码不同。假设您的页面采用 ISO-8859-1 编码,并且有人在您的表单中输入了希腊语或希伯来语字母。浏览器必须进行一些错误恢复,因为这些字符无法在 ISO-8859-1 中表示。 (实际上,他们将字符转换为数字字符引用,这在逻辑上都是错误的,但实际上可能是他们能做的最好的。)在这里使用&lt;form charset=utf-8&gt; 会有所帮助:无论编码是什么,表单数据都将以 UTF- 8位编码,可以处理任何字符。

如果您想告诉表单处理程序在其响应中应该使用哪种编码,那么您可以在表单中添加一个隐藏(或非隐藏)字段。

【讨论】:

感谢您的帮助。你知道如何将 accept-charset 默认设置为 UTF-8 吗? 根据 HTML 4.01,accept-charset 的默认值是 UNKNOWN,但 HTML5 草案更好地反映了现实:默认值是文档的字符编码。如果您的意思是设置在您的创作软件中使用的默认值,那么这一切都取决于该软件。 您的 Chrome 是什么版本? Accept-Charset 已经过时了,你不应该再依赖它了:code.google.com/p/chromium/issues/detail?id=112804 @Cyber​​Rusher,这在 Chrome 35 中仍然相关。accept-charset HTML 属性不同于 Accept-Charset HTTP 标头(这是您的链接文档所讨论的内容)。 @JukkaK.Korpela,accept-charset HTML 属性不是控制 Accept-Charset HTTP 标头吗?我的 Chrome 版本是“35.0.1916.153 m”,但请求标头中没有任何 Accept-Char。

以上是关于accept-charset="UTF-8" 参数在表单中使用时不执行任何操作的主要内容,如果未能解决你的问题,请参考以下文章

如何获取form表单提交后返回值

如何获取form表单提交后返回值?

支付宝PC扫码支付在Safari浏览器中验签失败(invalid-signature)

字符集和字符编码

Drupal用户登录块

Spring3 @ResponseBody注解引起头部Accept-Charset过大 zj_oschina