一尘不染

charset参数可以与http / 1.1中的application / json内容类型一起使用吗?

json

例如,它是否是有效的ajax请求

$.ajax({
    type: "POST",
    url: "SomePage.aspx/GetSomeObjects",
    contentType: "application/json; charset=utf-8",
    ...
});

有时作为示例,否则软件可能会在没有显式字符集的情况下崩溃

用于application / json媒体类型的rfc
4627
表示,它不接受第6节中的任何参数:

The MIME media type for JSON text is application/json.

Type name: application

Subtype name: json

Required parameters: n/a

Optional parameters: n/a

可以解释为charset不应该与application /json一起使用

第3节表明,这是没有必要指定字符集:

JSON text SHALL be encoded in Unicode.  The default encoding is
UTF-8.

Since the first two characters of a JSON text will always be ASCII
characters [RFC0020], it is possible to determine whether an octet
stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
at the pattern of nulls in the first four octets.

        00 00 00 xx  UTF-32BE
        00 xx 00 xx  UTF-16BE
        xx 00 00 00  UTF-32LE
        xx 00 xx 00  UTF-16LE
        xx xx xx xx  UTF-8

因为可以从内容推断出UTF-8、16、32编码。为什么说UTF-8是默认设置?在RFC中未指定选择其他字符编码的方式,无论如何都可以确定地找到该编码。还是存在其他支持Unicode的字符编码(非UTF-8、16、32)?

有人认为可以使用字符集

我不同意您的评估,认为 必须 将其删除。RFC
2046指出“除“文本”子类型以外的其他媒体类型可能选择采用此处定义的charset参数”,这表明在应用程序类型上对charset参数的存在没有限制。此外,RFC
2045指出“ MIME实现必须忽略其名称无法识别的任何参数”。因此,假设它的存在会造成任何伤害是不合理的。

兼容RFC的软件是否可以使用charset参数生成内容类型application / json?兼容RFC的软件是否应接受此类请求?


阅读 283

收藏
2020-07-27

共1个答案

一尘不染

最近的json rfc 7159说

注意:没有为该注册定义“字符集”参数。
确实添加一个对符合条件的收件人没有任何影响。

即,charset必须由符合条件的收件人忽略。

它与rfc 2045一致: “ MIME实现必须忽略其无法识别其名称的任何参数。” 因为rfc 7159仍然为application / jsonmime媒体类型(无参数)指定: “必需参数:n / a;可选参数:n / a”

json文本不再被限制为对象或数组,而基于前两个字符来计算字符编码的旧部分3在新的rfc中消失了。允许使用UTF-8,UTF-16或UTF-32,但无法指定编码(没有BOM,默认为UTF-8)。

charset参数可以与http / 1.1中的application / json内容类型一起使用吗?

如果charset="utf-8"使用则没有任何危害-
utf-8是json文本的默认编码,但是其他值可能会引起误解,因为该值必须由符合条件的收件人忽略。它只能破坏正确解析Content-Type标头的客户端,例如,将其逐字与“ application /
json”进行比较,
或者尝试使用utf-8编码以外的客户端解码json文本的客户端。

兼容RFC的软件是否可以使用charset参数生成内容类型application / json?

没有。没有为application / json定义任何参数。

兼容RFC的软件是否应接受此类请求?

是的,应该。的值charset必须忽略。


ECMA-404(JSON数据交换格式)以Unicode代码点的形式定义json文本,即json本身未指定有关编码详细信息的行为。

ECMA-262(ECMAScript语言规范)还在String(Unicode类型)的顶部定义了json格式。

2020-07-27