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

前端之家收集整理的这篇文章主要介绍了html – 如何在multipart/form-data HTTP POST请求中指定字符编码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
HTML 5规范描述了用于选择要在多部分表单提交中使用的字符编码的 algorithm(例如,UTF-8).但是,不清楚如何将所选编码中继到服务器,以便可以在接收端正确解码内容.

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

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

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

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

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

解决方法

HTML 5使用RFC 2388(RFC 7578废弃),但HTML 5显式从非文件字段中删除Content-Type标头,而RFC不:

The parts of the generated multipart/form-data resource that correspond to non-file fields must not have a Content-Type header specified. Their names and values must be encoded using the character encoding selected above (field names in particular do not get converted to a 7-bit safe encoding as suggested in RFC 2388).

RFC旨在允许多部分/表单数据在除HTML之外的其他环境中可用(尽管这是最常见的用途).在其他上下文中,允许使用Content-Type.只是不在HTML 5中(但在HTML 4中允许).

如果没有Content-Type标头,隐藏的_charset_表单字段(如果存在)是HTML 5< form>的唯一方式. submitter可以明确说明使用哪个charset.

根据您链接到的HTML 5算法规范,必须从< form>中选择所选的字符集. element的accept-charset属性(如果存在),否则是HTML本身使用的字符集(如果它与ASCII兼容),否则为UTF-8.这在算法规范中以及在引用HTML 5时在RFC 7578第5.1.2节中明确说明.

因此,实际上不需要由网络浏览器明确说明字符集,因为表单提交的接收者应该知道通过< form>如何预期哪些字符集.已创建,因此可以在解析提交时检查这些字符集.如果接收者想要知道所使用的特定字符集,则需要在< form>中包含隐藏的_charset_字段.

猜你在找的HTML相关文章