multipart/form-data,字段的默认字符集是什么?

14

如果没有指定字符集,解码multipart/form-data时应该使用哪个默认编码?RFC2388规定:

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

每个multipart/form-data部分都应该有一个content-type。在字段元素是文本的情况下,用于文本的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似乎没有解释这一点,所以我有点迷失。
谢谢!
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_字段才能找出它呢?

当我编写一个使用XMLHttpRequest.send发送FormData对象的Chrome扩展时,遇到了这个问题,该方法始终使用UTF-8进行编码,无论源文档编码是什么

让请求实体正文成为使用utf-8作为显式字符编码的multipart/form-data编码算法对数据进行编码的结果。

让mime类型成为“multipart/form-data;”、“boundary =”和由multipart/form-data编码算法生成的multipart/form-data边界字符串连接而成的字符串。

如我之前所发现,POST请求中没有指定charset=utf-8,除非您在表单中包含一个空的_charset_字段,在这种情况下,该字段自动填充为"utf-8"。

这是我的理解,欢迎对我的假设进行任何更正!


我也遇到完全相同的问题,但是解决方案并不适用于我。我得到的结果是一部分载荷,其中name设置为charset,但没有任何声明。这是我的输入:<input type="hidden" name="charset"> - Ercksen
1
@Ercksen,显然你应该使用“___charset___”输入。 - Unicorn

8
HTTP 1.1的默认字符集是ISO-8859-1(Latin1),我猜这也适用于此处。
“charset”参数与某些媒体类型一起使用,以定义数据的字符集(第3.4节)。当发送方未提供显式的charset参数时,接收到“text”类型的媒体子类型通过HTTP定义了默认的charset值为“ISO-8859-1”。除“ISO-8859-1”或其子集之外的字符集中的数据必须标记有适当的charset值。请参见第3.4.1节以获取兼容性问题。

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规范2.3
我无法从http://www.caucho.com/resin-4.0/reference.xtp找到任何可以改变Resin这种行为的设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接