13

如果没有给出字符集,应该使用什么默认编码来解码 multipart/form-data?RFC2388 指出:

4.5 表单数据中的文本字符集

multipart/form-data 的每个部分都应该有一个内容类型。在字段元素是文本的情况下,文本的 charset 参数指示使用的字符编码。

例如,用户在其中输入“Joe owes <eu>100”(其中 <eu> 是欧元符号)的文本字段的表单可能会将表单数据返回为:

--AaB03x
content-disposition: form-data; name="field1"
content-type: text/plain;charset=windows-1250
content-transfer-encoding: quoted-printable>>

Joe owes =80100.
--AaB03x

就我而言,未设置字符集,我不知道如何解码该文本/纯文本部分中的数据。因为我不想强制执行一些不是标准行为的东西,所以我在问这种情况下的预期行为是什么。RFC 似乎没有解释这一点,所以我有点迷路了。

谢谢!

4

3 回答 3

10

这显然在 HTML5 中发生了变化(参见http://dev.w3.org/html5/spec-preview/constraints.html#multipart-form-data)。

生成的 multipart/form-data 资源中与非文件字段对应的部分不得指定 Content-Type 标头。

那么字符集在哪里指定呢?据我从编码算法中可以看出,唯一的地方是在名为_charset_的表单数据集条目中。

如果您的表单没有名为_charset_的隐藏输入,会发生什么?我已经在 Chrome 28 中对此进行了测试,发送了一个以 UTF-8 编码的表单和一个以 ISO-8859-1 编码的表单,并检查了发送的标头和有效负载,我在任何地方都看不到字符集(即使文本编码肯定会改变)。如果我在表单中包含一个空的_charset_字段,Chrome 会使用正确的字符集类型填充该字段。我猜任何服务器端代码都必须寻找那个_charset_字段才能弄清楚?

我在编写一个使用FormData对象的 XMLHttpRequest.send 的 Chrome 扩展程序时遇到了这个问题,无论源文档编码是什么,它总是以 UTF-8 编码

让请求实体主体是运行 multipart/form-data 编码算法的结果,其中 data 为表单数据集,utf-8 为显式字符编码。

设 mime 类型为“multipart/form-data;”、U+0020 SPACE 字符、“boundary=”和 multipart/form-data 编码算法生成的 multipart/form-data 边界字符串的串联。

正如我之前发现的,charset=utf-8 没有在 POST 请求的任何地方指定,除非您在表单中包含一个空的_charset_字段,在这种情况下,它将自动填充“utf-8”。

这是我对事物状态的理解。我欢迎对我的假设进行任何更正!

于 2013-07-23T18:48:35.913 回答
7

HTTP 1.1的默认字符集是 ISO-8859-1 (Latin1),我猜这也适用于此。

3.7.1 规范化和文本默认值

--剪辑--

“charset”参数与某些媒体类型一起使用来定义数据的字符集(第 3.4 节)。当发送者没有提供明确的字符集参数时,“文本”类型的媒体子类型被定义为在通过 HTTP 接收时具有“ISO-8859-1”的默认字符集值。除“ISO-8859-1”或其子集以外的字符集中的数据必须用适当的字符集值标记。有关兼容性问题,请参阅第 3.4.1 节。

于 2010-11-03T10:25:32.057 回答
2

感谢@owlman 的详细解释。

这里还有更多信息:

上传请求负载片段:

------WebKitFormBoundarydZAwJIasnBbGaUqM
Content-Disposition: form-data; name="file"; filename="xxx.txt"
Content-Type: text/plain

如果“xxx.txt”中有一些使用 UTF-8 编码的 UNICODE 字符,Resin(从 4.0.40 开始)无法正确解码,但 Jetty(9.x) 可以。

我认为 Resin 出现这种行为的原因是 Content-type 没有指定任何编码,所以 Resin 使用“ISO8859-1”解码文件名,这可能会导致乱码。

我做了一些谷歌搜索:

https://mail-archives.apache.org/mod_mbox/struts-user/200310.mbox/%3C3FA0395B.1080209@kumachan.net.nz%3E

Resin 的行为似乎符合 Servlet Spec 2.3

而且我无法从http://www.caucho.com/resin-4.0/reference.xtp找到任何 可以改变 Resin 行为的设置。

于 2016-07-25T09:31:26.517 回答