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

Gre*_*own 9 html post multipartform-data utf-8

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

通常,通过在Content-Type请求标头的值中附加"charset"参数来表示字符编码.但是,似乎没有为multipart/form-dataMIME类型定义此参数:

https://tools.ietf.org/html/rfc7578#section-8

多部分表单提交中的每个部分都可以提供自己的Content-Type标题; 但是,RFC 7578指出"实际上,许多广泛部署的实现不会在每个部分中提供字符集参数,而是依赖于'默认字符集'的概念,用于多部分/表单数据实例".

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

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

Rem*_*eau 8

HTML 5使用RFC 2388(RFC 7578废弃),但HTML 5 明确地Content-Type从非文件字段中删除标头,而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属性中选择所选的字符集(如果存在),否则是HTML本身使用的字符集(如果它与ASCII兼容),否则为UTF-8.这在算法规范中以及在引用HTML 5时在RFC 7578第5.1.2节中明确说明.

因此,实际上不需要通过Web浏览器明确声明字符集,因为表单提交的接收者应该知道根据<form>创建的方式预期哪些字符集,因此可以检查那些字符集( s)在解析提交时.如果接收者想要知道所使用的特定字符集,则需要在其中包含隐藏_charset_字段<form>.