application/x-www-form-urlencoded和charset="utf-8"是什么意思?

34

当Content-type为application/x-www-form-urlencoded时,省略;charset="utf-8"是惯例吗?

特别是在表单标签中使用accept-charset="utf-8"时,我希望看到一些指示表明头文件中正在使用utf-8,但我没有看到任何指示。

这里是我在Chrome中进行的简单测试。表单页面如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>
<form method="POST" action="printenv.cgi" accept-charset="utf-8">
Your name:
<input name="name" type="text" size="30">
</form>
</body>
</html>

生成请求的标头如下:

POST /printenv.cgi HTTP/1.1
Host: ...:8000
Connection: keep-alive
Content-Length: 19
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: http://...:8000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://...:8000/utf8-test.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

如何规定表单参数值的编码方式?

2个回答

36
  1. 此媒体类型未定义字符集参数。

  2. 有关编码指南,请参见https://url.spec.whatwg.org/#application/x-www-form-urlencoded

application/x-www-form-urlencoded标准意味着使用UTF-8和百分号编码。

但是:

传统的面向服务器的实现可能不仅要支持UTF-8以外的编码方式,还必须针对名称为_charset的元组具有特殊逻辑。由于只有UTF-8符合规范,因此此类逻辑没有在此处描述。


7
有趣的小细节我之前不知道:“如果输入项的名称为“_charset_”,类型为“hidden”,则将其值替换为字符集。” - deceze
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Remy Lebeau
1
Remy:文档类型声明不影响浏览器对表单编码的处理。 - Julian Reschke

5
请注意,在上述链接的第2步中,它说:“否则,让所选字符编码为UTF-8。”(参见:http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm)。
我认为这似乎表明用户代理使用UTF-8是最佳实践?
请看:http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars 以下是其中的内容:
B.2.1 URI属性值中的非ASCII字符
虽然URI不包含非ASCII值(参见[URI]第2.1节),但作者有时会在期望URI的属性值中指定它们(即在DTD中定义为%URI;)。例如,以下href值是不合法的:
...
我们建议用户代理采用以下惯例来处理这种情况中的非ASCII字符:
Represent each character in UTF-8 (see [RFC2279]) as one or more bytes.
Escape these bytes with the URI escaping mechanism (i.e., by converting each byte to %HH, where HH is the hexadecimal notation of the byte value).

这个过程会产生一个语法正确的URI(在[RFC1738]第2.2节或[RFC2141]第2节中定义),这个URI与HTML文档使用的字符编码无关。

注意。有些旧版用户代理程序简单地使用接收到文档的字符编码的字节来处理HTML中的URI。一些旧版HTML文档依赖于此做法,并会在被转码时出现错误。想要处理这些旧版文档的用户代理应该在接收到包含非法字符的URI时,首先使用基于UTF-8的转换。仅当结果URI不能解析时,才应该尝试基于接收到文档的字符编码的字节构建一个URI。

注意。对于A元素的name属性值也应该使用相同的基于UTF-8的转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接