HTTP POST请求中JSON主体的默认编码

9

当content-type为“application/json”且没有明确的字符集时,HTTP POST请求的默认编码是什么?

似乎有两个规范存在冲突:

  • JSON规范指出:“JSON文本应使用Unicode编码。默认编码为UTF-8。”
  • HTTP规范指出:“当发送方未提供显式的字符集参数时,通过HTTP接收到的‘text’类型的媒体子类型被定义为具有“ISO-8859-1”的默认字符集值。”

1
您未使用“text / ...”媒体类型发送请求,因此HTTP规范中的该条款不适用。 - Remy Lebeau
3个回答

7
application/json媒体类型在RFC 7158 JavaScript Object Notation (JSON) Data Interchange Format(取代RFC 4627)中有正式定义,并已注册到IANA,没有必需或可选参数(因此,charset未定义为application/json)。

第8.1节字符编码说:

JSON文本应使用UTF-8、UTF-16或UTF-32进行编码。 默认编码为UTF-8,以UTF-8编码的JSON文本在互操作方面是可互换的,即最多的实现将成功读取这些文本;很多实现不能成功地读取其他编码(例如UTF-16和UTF-32)的文本。

实现程序不得向JSON文本开头添加字节顺序标记。为了实现互操作性,解析JSON文本的实现程序可以忽略字节顺序标记的存在,而不将其视为错误。

application/...媒体类型通常定义为二进制格式。 JSON解析器非常容易通过查看前几个字节来区分UTF-8、UTF-16和UTF-32,因此不需要BOM(如上所述,不允许使用)或显式charset(未定义)。


1
这里是W3C的XMLHttpRequest算法表单。

The JSON response entity body is either a JavaScript value representing the response entity body. If the JSON response entity body is null, set it to the return value of the following algorithm:

1. Let JSON text be the result of running utf-8 decode on byte stream response entity body.

2. Return the result of invoking the initial value of the parse property of the JSON object defined in JavaScript, with JSON text as

its only argument, or null if that function throws an exception.

http://www.w3.org/TR/XMLHttpRequest/#json-response-entity-body

服务器默认应将其设置为UTF-8。

谢谢。但是我在询问关于HTTP请求,而不是响应。 - Kwang Yul Seo

1
您正在查看RFC 2616,该文档已被RFC 7231取代。 RFC 7231中已删除了RFC 2616的文本。无论如何,该条款仅适用于“text/...”媒体类型,而不适用于“application/...”媒体类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接