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

时间:2012-10-11 00:40:17

标签: html forms spring-mvc encoding freemarker

我在表单中使用accept-charset =“utf-8”属性,发现在使用非ascii进行表单发布时,标头在请求标头中有不同的accept charset选项。有什么我想念的吗?我的表单看起来像这样

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

提前致谢

1 个答案:

答案 0 :(得分:8)

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

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

accept-charset元素中的form属性不会影响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中表示。 (实际上,他们将字符转换为数字字符引用,这在逻辑上都是错误的,但实际上可能是最好的。)使用<form charset=utf-8>有助于:无论编码是什么,表单数据都将作为UTF-8编码,可以处理任何字符。

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