当我向REST服务发出带有JSON body的POST请求时,我在消息头中包含了Content-type: application/json; charset=utf-8
。如果没有这个头文件,我会从服务中得到一个错误。我也可以在没有;charset=utf-8
部分的情况下成功地使用Content-type: application/json
。
charset=utf-8
到底是做什么的?我知道它指定了字符编码,但服务没有它也能正常工作。此编码是否限制了邮件正文中的字符?
发布于 2012-02-13 10:49:44
报头只表示内容的编码内容。不一定可以从内容本身推断出内容的类型,也就是说,您不一定只需要查看内容并知道如何处理它。这就是HTTP头的作用,它们告诉接收者他们(应该)处理的是哪种类型的内容。
Content-type: application/json; charset=utf-8
指定内容为JSON格式,并以UTF8字符编码进行编码。指定编码对于JSON来说有些多余,因为缺省的(只有?)JSON的编码是UTF-8。因此,在这种情况下,接收服务器显然很高兴知道它正在处理JSON,并假设默认情况下编码是UTF-8,这就是为什么它可以使用或不使用头部的原因。
此编码是否限制邮件正文中可以包含的字符?
不是的。你可以在标题和正文中发送任何你想要的东西。但是,如果两者不匹配,您可能会得到错误的结果。如果在报头中指定内容是UTF-8编码的,但实际上发送的是Latin1编码的内容,则接收方可能会生成垃圾数据,试图将Latin1编码的数据解释为UTF-8。当然,如果您指定要发送Latin1编码的数据,并且实际上是这样做的,那么是的,您在Latin1中只能编码256个字符。
发布于 2013-02-19 18:44:46
为了证实@deceze关于默认JSON编码是UTF-8的声明...
JSON文本应采用Unicode编码。默认编码为UTF-8。
由于JSON文本的前两个字符始终是ASCII字符RFC0020,因此可以通过查看前四个八位字节中的空值模式来确定八位字节流是UTF-8、UTF-16 (BE或LE)还是UTF-32 (BE或LE)。
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 UTF-8
发布于 2016-04-27 14:53:23
请注意,IETF RFC7158已经取代了IETF RFC4627。在8.1节中,它收回了@Drew之前引用的文本,说:
实现不能在JSON文本的开头添加字节顺序标记。
https://stackoverflow.com/questions/9254891
复制相似问题