当前位置: 首页 > 知识库问答 >
问题:

在http/1.1中,charset参数是否可以与application/json内容类型一起使用?

拓拔富
2023-03-14

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

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

它有时被用作示例,或者软件可以在没有显式字符集的情况下中断。

rfc 4627 for application/json媒体类型表示不接受第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中没有指定选择其他字符编码的方式,无论如何都可以确定地找到编码。或者还有其他(不是UTF-8,16,32)支持Unicode的字符编码?

一些人认为charset可以用于:

我不同意你的评估,那就是必须放弃。RFC 2046声明“除“文本”子类型之外的其他媒体类型可能选择使用此处定义的字符集参数”,这表明对应用程序类型上字符集参数的存在没有限制。此外,RFC 2045声明“MIME实现必须忽略其名称不可识别的任何参数。”因此,假设它的存在会造成任何伤害是不合理的。

兼容rfc的软件可以生成带有charset参数的内容类型应用程序/json吗?符合rfc的软件应该接受这样的请求吗?

共有3个答案

庞安晏
2023-03-14

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

根据朱利安·雷什克的回答,显然不是。但是,正如您所指出的,如果您想与那些不符合rfc的主机交谈,您可能会在野外遇到它,然后必须处理它。

首先,如果您有代码来处理HTTP框架中基于文本的消息的Accept-Charset和内容类型的charset部分,为什么不把它也用于JSON呢?在编程方面,它更容易(json没有特别的规则),也更通用。

就个人而言,我会说让我们对每一位文本使用Unicode(使用您引用的编码检测)。不幸的是,有些客户端设备,例如日本手机,不处理Unicode,而只处理Shift\u-JIS。否则他们会很高兴成为消费者(和付费客户)。那你打算怎么办?在我的特殊情况下,为了让这些客户机加入,我通过标准HTTP机制配置了字符集。

顺便说一下,HTTP 2.0正在开发中,如果这些人希望创建一个严格遵守的标准,他们将不得不编写验收测试。当然,这也可能意味着如果规则不能偶尔改变,则排除上述遗留客户。

如果除了你没有其他人是顺从的,那么顺从又有什么意义呢?我想知道,即使是Opera是否符合要求,或者,就这一点而言,它实现的所有rfc是否都可以在一开始就得到明确的解释。我不这么认为,尤其是在像HTTP这样的大型应用程序中。

如果这听起来像是对超文本传输协议的抨击,让我这么说吧:超文本传输协议是一个伟大的标准,它的概念不仅彻底改变了互联网。例如,指定资源的方式(无状态)或缓存的方式已经建立了良好的模式,这些模式已经渗透到许多应用程序的实现中。HTTP 2可以从1.1中断的地方开始。让我们只希望SPDY不会1比1被采用。我不想这么说,但在这种情况下,微软的超文本传输协议速度移动性在许多方面比谷歌的PUSHy(而且迄今为止还不稳定)SPDY更有超文本传输协议。

邵沛
2023-03-14

最近的json rfc 7159表示:

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

i、 例如,字符集必须被符合要求的收件人忽略。

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

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

在http/1.1中,charset参数是否可以与application/json内容类型一起使用?

如果使用charset="utf-8"也没有什么坏处-utf-8是json文本的默认编码,但是其他值可能会误导,因为合规的收件人必须忽略该值。它只能中断不正确解析Content-Type标头的客户端,例如,通过将其逐字与“应用程序/json”进行比较,或者尝试使用utf-8编码以外的其他编码来解码json文本的客户端。

符合rfc的软件是否可以使用字符集参数生成内容类型application/json?

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

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

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

ECMA-404(JSON数据交换格式)根据Unicode代码点定义json文本,即json本身没有指定关于编码细节的行为。

ECMA-262(ECMAScript语言规范)还定义了字符串(Unicode类型)之上的json格式。

南宫凯康
2023-03-14

Application/json没有定义charset参数,所以包含一个是不正确的。RFC2046所说的是,应用程序类型通常可以有一个字符集参数,如Application/xml。但是JSON没有。

 类似资料:
  • 问题内容: 例如,它是否是有效的ajax请求: 有时仅作为示例,否则软件可能会在没有显式字符集的情况下崩溃。 用于application / json媒体类型的rfc 4627 表示,它不接受第6节中的任何参数: 可以解释为charset不应该与application /json一起使用。 和第3节表明,这是没有必要指定字符集: 因为可以从内容推断出UTF-8、16、32编码。为什么说UTF-8是

  • 嗨,有人能帮我处理这个错误吗?当我使用邮递员发送邮件请求时,这里是我的控制器 这就是我使用postman发送json的方式 我正在尝试搜索如何修复它,但错误仍然存在 编辑:这是邮递员的标题 提前致谢

  • 问题内容: 似乎JSON默认编码为UTF-8,Spring MVC 默认返回 ,很难更改。 问题答案: 根据RFC 4627 JSON文本应以Unicode编码。默认编码为UTF-8。 它继续描述了如何检测不同的UTF- *编码,这表明不支持其他编码。 “ SHALL”表示此处的绝对要求(请参阅RFC 2119)。 而且真的是没有理由使用与JSON非UTF编码(如任何可以处理JSON可以 肯定 处

  • 问题内容: 使用firebug时,我在asp.net mvc 4项目中收到此有线错误“ NetworkError:415无法处理… xt / xml; charset = utf-8’– ”。 代码: 服务代码: 该接口是: 和网络配置,我在WCF中使用了无文件: 问题答案: 您需要使用,而不是代码中的常规。这将为端点配置适当的绑定()和行为()以遵守该属性。

  • 是否可以将“默认内容类型”设置为“application/json;v=2.0”。我说 default 是因为我使用的是 HttpClient 类,并且我使用 DefaultRequestHeaders 将我的代理设置为默认值。 我按照这个例子来创建我的头https://stackoverflow.com/a/10679340/196526,但是我也使用版本控制,关于版本控制的信息保存在内容类型中

  • 问题内容: 我正在尝试通过HTML执行以下操作: 基本上用户按下登录按钮,就会调用onLogin方法,该方法会将帖子发送到我的API。帖子工作正常,我确实在.then()承诺中得到了答复。 但是,尝试执行类似的操作并不会以我期望用户登录时HTML会执行的操作来更新DOM。 当我在promise中收到响应并且找不到“ vm”实例时,可能是我处于某种后台线程(对不起,这里是移动开发人员)? 谢谢 问题