Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 如何在多部分/表单数据HTTP POST请求中指定字符编码?_Html_Post_Utf 8_Multipartform Data - Fatal编程技术网

Html 如何在多部分/表单数据HTTP POST请求中指定字符编码?

Html 如何在多部分/表单数据HTTP POST请求中指定字符编码?,html,post,utf-8,multipartform-data,Html,Post,Utf 8,Multipartform Data,HTML5规范描述了一种用于选择多部分表单提交中使用的字符编码的方法(例如UTF-8)。然而,不清楚所选编码应如何中继到服务器,以便在接收端正确解码内容 通常,字符编码是通过在内容类型请求头的值后面附加一个“charset”参数来表示的。但是,似乎没有为multipart/form dataMIME类型定义此参数: 多部分表单提交中的每个部分都可以提供自己的内容类型标题;然而,RFC 7578指出,“实际上,许多广泛部署的实现并不在每个部分中提供字符集参数,而是依赖于多部分/表单数据实例的“默

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

通常,字符编码是通过在
内容类型
请求头的值后面附加一个“charset”参数来表示的。但是,似乎没有为
multipart/form data
MIME类型定义此参数:

多部分表单提交中的每个部分都可以提供自己的
内容类型
标题;然而,RFC 7578指出,“实际上,许多广泛部署的实现并不在每个部分中提供字符集参数,而是依赖于多部分/表单数据实例的“默认字符集”概念”

RFC 7578继续建议可以使用隐藏的“\u字符集\u”表单字段来实现此目的。但是,Safari(9.1)和Chrome(51)似乎都没有填充此字段,也没有提供任何每个零件的编码信息

我查看了两种浏览器生成的请求头,没有看到任何明显的字符编码信息。有人知道浏览器是如何将此信息传送到服务器的吗?

HTML5使用RFC2388(已被RFC7578淘汰),但是HTML5明确地从非文件字段中删除
内容类型
头,而RFC不:

生成的多部分/表单数据资源中与非文件字段相对应的部分不得指定
内容类型
标题。它们的名称和值必须使用上面选择的字符编码进行编码(尤其是字段名称,不能按照RFC 2388中的建议转换为7位安全编码)

RFC的设计允许
多部分/表单数据
在HTML之外的其他上下文中可用(尽管这是它最常用的用法)。在这些其他上下文中,允许使用内容类型。只是不在HTML5中(但在HTML4中是允许的)

如果没有
内容类型
标题,则隐藏的
\u字符集
表单字段(如果存在)是HTML 5
提交者可以明确说明使用哪个字符集的唯一方法

根据链接到的HTML 5算法规范,所选字符集必须从
元素的
accept charset
属性(如果存在)中选择,否则,如果与ASCII兼容,则为HTML本身使用的字符集,否则为UTF-8。这在算法规范以及RFC 7578第5.1.2节(参考HTML 5)中有明确说明


因此,实际上不需要web浏览器显式地声明字符集,因为表单提交的接收者应该知道通过
是如何创建的,应该期望哪个字符集,因此可以在解析提交时检查这些字符集。如果接收者想要知道所使用的特定字符集,则需要在

中包含一个隐藏的
\u字符集
字段。“实际上,不需要通过web浏览器明确说明字符集,因为表单提交的接收者应该知道根据创建的方式需要哪些字符集。”这实际上是我问题的基础。服务器如何知道表单是如何创建的?表单声明本身不会提交给服务器,只会提交表单中输入的数据。如果不在隐藏的
\u charset\u
参数中,
accept charset
属性的值是如何传播到服务器的?@GregBrown如果没有
\u charset\u
,HTML的编写者和表单接收者的编写者(如果他们不相同)将需要在服务器端相互协调<代码>接受字符集应仅包含接收方准备处理的字符集。Web服务器应该配置为知道HTML作为什么字符集。web浏览器在表单提交中传递字符集的方式只有两种,
内容类型
\u字符集
,但HTML 5禁止
内容类型
。确定。这也是我得出的结论。谢谢你的详细回复。