代码之家  ›  专栏  ›  技术社区  ›  Malax

多部分/表单数据,字段的默认字符集是什么?

  •  10
  • Malax  · 技术社区  · 14 年前

    如果没有给出字符集,应该使用什么默认编码来解码多部分/表单数据?RFC2388声明:

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

    多部分/表单数据的每个部分都应该有一个内容- 文本的参数指示使用的字符编码。

    例如,一个带有文本字段的表单,其中用户键入“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 回复  |  直到 7 年前
        1
  •  6
  •   Gareth Davidson    14 年前

    的默认字符集 HTTP 1.1 是ISO-8859-1(拉丁语),我想这也适用于这里。

    3.7.1规范化和文本默认值

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

        2
  •  9
  •   owlman    11 年前

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

    生成的多部分/表单数据资源中与非文件字段对应的部分不能指定内容类型头。

    _字符集_ .

    如果窗体没有名为 ,会发生什么?我在Chrome 28中测试过,发送一个UTF-8编码的表单和一个ISO-8859-1编码的表单,并检查发送的头和有效负载,我在任何地方都看不到字符集(即使文本编码肯定会改变)。如果我包括一个空的 _字符集_ 字段中,Chrome用正确的字符集类型填充它。我想任何服务器端代码都必须查找 _字符集_ 去弄清楚?

    表格数据 对象,它 always gets encoded in UTF-8 no matter what the source document encoding is

    将请求实体体作为运行以数据为表单数据集、以utf-8为显式字符编码的多部分/表单数据编码算法的结果。

    设mime type为“multipart/form data;”、U+0020空格字符“boundary=”和multipart/form数据编码算法生成的multipart/form数据边界字符串的连接。

    _字符集_ 表单中的字段,在本例中,该字段将自动填充为“utf-8”。

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

        3
  •  2
  •   PickBoy    8 年前

    多亏了@owlman的详细解释。

    这里有更多信息:

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

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

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

    我用谷歌搜索了一下:

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

    似乎树脂的行为符合Servlet规范2.3

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