2010-11-03 116 views
7

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

4.5在形式数据

多部分/格式数据的每个部分的文本字符集是应该有一个内容 - 类型。在字段元素是文本的情况下,文本的字符集 参数指示使用的字符编码。

例如,与文本字段的形式,其中输入一个用户“乔欠 <欧盟> 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 

在我的情况下,charset没有设置,我不知道如何解码该文本/平原部分的数据。因为我不想强制执行不是标准行为的事情,所以我在询问这种情况下的预期行为。 RFC似乎没有解释这一点,所以我有点失落。

谢谢!

回答

5

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

3.7.1规范化和文本默认

--snip--

的 “字符集” 参数用于与某些媒体类型来定义字符集(第3.4节)的数据。当发件人未提供显式字符集参数时,“文本”类型的媒体子类型定义为在通过HTTP接收时具有默认字符集值“ISO-8859-1”。除“ISO-8859-1”或其子集以外的字符集中的数据必须用适当的字符集值标记。有关兼容性问题,请参见第3.4.1节。

5

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

与非文件字段对应的生成的多部分/表单数据资源的部分不能指定Content-Type头。

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

如果您的表单没有名为的隐藏输入_charset_,会发生什么情况?我已经在Chrome 28中测试了这一点,发送一个以UTF-8编码的格式和一个ISO-8859-1编码的格式,并检查发送的头文件和有效载荷,并且我没有看到任何地方给出的字符集(尽管文本编码肯定会改变)。如果我在表单中包含一个空的字段,则Chrome会使用正确的字符集类型填充该字段。我猜想任何服务器端代码都必须查找那个_charset_字段来弄清楚它?

我遇到了这个问题,同时编写了一个Chrome扩展,使用XMLHttpRequest.send的FormData对象,其中always gets encoded in UTF-8 no matter what the source document encoding is

让请求实体主体是以数据作为表单数据集并以utf-8作为显式字符编码运行multipart/form-data编码算法的结果。设mime类型为“multipart/form-data;”,U + 0020 SPACE字符,“boundary =”以及由multipart/form-data编码生成的multipart/form-data边界字符串算法。

正如我刚才发现,字符集= UTF-8是不是在任何地方POST请求指定的,除非你在表单中的空_charset_领域,在这种情况下会自动得到填充“UTF- 8" 。

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

+0

完全一样的问题对我来说,但解决方案不起作用。我取而代之的是'name'设置为'charset'的负载的一部分,但根本没有声明。这是我的输入:'' – Ercksen 2016-01-07 17:20:47

+0

@Ercksen,设想你应该使用“__ \ _ charset \ ___”输入 – Romeno 2016-03-02 15:38:42

1

感谢@owlman的详细解释。

只是一些更多的信息在这里:

上传请求负载片段:

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

如果 “xxx.txt” 具有使用UTF-8编码,树脂(如4.0中有一些UNICODE字符。 40)无法正确解码,但Jetty(9.x)可以。

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

我做了一些谷歌搜索:

https://mail-archives.apache.org/mod_mbox/struts-user/200310.mbox/%[email protected]%3E

看来,树脂的行为是根据Servlet规范2.3

我不能找到http://www.caucho.com/resin-4.0/reference.xtp 可以改变这种行为的任何设置树脂。