【问题标题】:multipart/form-data, what is the default charset for fields?multipart/form-data,字段的默认字符集是什么?
【发布时间】:2011-05-04 09:09:58
【问题描述】:

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

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

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

例如,一个带有文本字段的表单,用户在其中输入了“Joe owes” 100' 其中 是欧元符号可能返回表单数据 如:

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

Joe owes =80100.
--AaB03x

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

谢谢!

【问题讨论】:

    标签: http standards-compliance multipartform-data rfc


    【解决方案1】:

    这显然在 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 扩展程序时遇到了这个问题,always gets encoded in UTF-8 no matter what the source document encoding is

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

    设mime type为“multipart/form-data;”、一个U+0020空格字符、“boundary=”和multipart/form-data编码算法生成的multipart/form-data边界字符串的串联.

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

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

    【讨论】:

    • 对我来说完全相同的问题,但解决方案不起作用。我得到的是负载的一部分,name 设置为charset,但根本没有声明。这是我的输入:<input type="hidden" name="charset">
    • @Ercksen,显然你应该使用“_charset_”输入
    【解决方案2】:

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

    3.7.1 规范化和文本默认值

    --剪辑--

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

    【讨论】:

      【解决方案3】:

      感谢@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 的这种行为。

      【讨论】:

        猜你喜欢
        • 2011-01-04
        • 2022-06-25
        • 2019-02-07
        • 1970-01-01
        • 2014-05-13
        • 2010-12-20
        • 2018-04-07
        • 2010-11-05
        • 2014-05-09
        相关资源
        最近更新 更多