multipart/form-data HTTP POST 请求中如何指定字符编码?

问题描述 投票:0回答:1

HTML 5 规范描述了一种算法,用于选择多部分表单提交中使用的字符编码(例如 UTF-8)。但是,尚不清楚如何将所选编码中继到服务器,以便内容可以在接收端正确解码。

通常,字符编码是通过将“charset”参数附加到

Content-Type
请求标头的值来表示的。但是,此参数似乎没有为
multipart/form-data
MIME 类型定义:

https://www.rfc-editor.org/rfc/rfc7578#section-8

多部分表单提交中的每个部分都可以提供自己的

Content-Type
标头;然而,RFC 7578 指出“实际上,许多广泛部署的实现并不在每个部分提供字符集参数,而是依赖于多部分/表单数据实例的‘默认字符集’概念”。

RFC 7578 继续建议隐藏的“_charset_”表单字段可用于此目的。但是,Safari (9.1) 和 Chrome (51) 似乎都没有填充此字段,也没有提供任何每个部分的编码信息。

我查看了两个浏览器生成的请求标头,没有看到任何明显的字符编码信息。有谁知道浏览器如何将这些信息传递到服务器?

html post utf-8 multipartform-data
1个回答
11
投票

HTML 5 使用 RFC 2388(已被 RFC 7578 废弃),但是 HTML 5 显式 从非文件字段中删除

Content-Type
header,而 RFC 则没有:

生成的 multipart/form-data 资源中与非文件字段对应的部分不得指定

Content-Type
标头。它们的名称和值必须使用上面选择的字符编码进行编码(特别是字段名称不会按照 RFC 2388 中的建议转换为 7 位安全编码)。

RFC 旨在允许

multipart/form-data
除了 HTML 之外还可以在其他上下文中使用(尽管这是其最常见的用途)。 在其他情况下,允许使用
Content-Type
。 只是 HTML 5 中没有(但 HTML 4 中允许)。

如果没有

Content-Type
标头,隐藏的
_charset_
表单字段(如果存在)是 HTML 5
<form>
提交者可以明确 声明使用哪个字符集的唯一方式。

根据您链接到的 HTML 5 算法规范,所选字符集必须从

<form>
元素的
accept-charset
属性(如果存在)中选择,否则如果它与 ASCII 兼容,则为 HTML 本身使用的字符集,否则为 UTF -8。 算法规范以及 RFC 7578 第 5.1.2 节中提到 HTML 5 时明确说明了这一点。

因此,实际上不需要网络浏览器显式地声明字符集,因为表单提交的接收者应该根据

<form>
的创建方式知道期望使用哪个字符集,因此可以在解析提交时检查这些字符集。 如果接收方想知道使用的特定字符集,则需要在
_charset_
中包含隐藏的
<form>
字段。

© www.soinside.com 2019 - 2024. All rights reserved.