通常,字符编码通过将“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)似乎都不会填充此字段,也不会提供任何每部分编码信息.
我查看了两个浏览器生成的请求标头,但没有看到任何明显的字符编码信息.有谁知道浏览器如何将这些信息传达给服务器?
解决方法
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_字段.