HTML 5规范描述了algorithm,用于选择要在多部分表单提交中使用的字符编码(例如UTF-8)。但是,目前尚不清楚如何将所选编码中继到服务器,以便可以在接收端正确解码内容。
通常,字符编码通过附加" charset"来表示。参数Content-Type
请求标头的值。但是,似乎没有为multipart/form-data
MIME类型定义此参数:
https://tools.ietf.org/html/rfc7578#section-8
多部分表单提交中的每个部分都可以提供自己的Content-Type
标题;但是,RFC 7578指出,在实践中,许多广泛部署的实现不会在每个部分中提供字符集参数,而是依赖于默认字符集的概念。对于multipart / form-data实例"。
RFC 7578继续建议隐藏的" _charset _"表单字段可用于此目的。但是,Safari(9.1)和Chrome(51)似乎都没有填充此字段,也没有提供任何每部分编码信息。
我查看了两个浏览器生成的请求标头,但是我没有看到任何明显的字符编码信息。有谁知道浏览器如何将这些信息传达给服务器?
答案 0 :(得分:7)
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节中明确说明。
因此,由于表单提交的接收者应该知道哪些字符集可以通过{如何显示来明确地显示,因此实际上不需要字符集。 {1}}已创建,因此可以在解析提交时检查这些字符集。如果接收方想要知道所使用的特定字符集,则需要在<form>
中包含隐藏的_charset_
字段。