33

;charset="utf-8"当 Content-type 为 时是否习惯性省略application/x-www-form-urlencoded

特别是,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

指定表单参数值如何编码的约定是什么?

4

2 回答 2

33
  1. 没有为此媒体类型定义字符集参数。

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

application/x-www-form-urlencoded标准暗示 UTF-8 和百分比编码。

尽管:

传统的面向服务器的实现可能必须支持 UTF-8 以外的编码,并且对名称为_charset. 这样的逻辑在这里没有描述,因为只有 UTF-8 符合。

于 2013-05-30T06:05:45.473 回答
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。

笔记。基于 UTF-8 的相同转换应应用于 A 元素的 name 属性值。

于 2014-12-30T22:00:36.807 回答