Character encoding 什么是;内容类型:application/json;字符集=utf-8“;真的吗?

Character encoding 什么是;内容类型:application/json;字符集=utf-8“;真的吗?,character-encoding,mime-types,Character Encoding,Mime Types,当我向REST服务发出带有JSON主体的POST请求时,我包括内容类型:application/JSON;消息头中的字符集=utf-8。如果没有这个头,我会从服务中得到一个错误。我还可以成功地使用内容类型:application/json,而无需;字符集=utf-8部分 charset=utf-8到底做什么?我知道它指定了字符编码,但是没有它服务就可以正常工作。这种编码是否限制了邮件正文中可以包含的字符?标题仅表示内容的编码内容。不一定能从内容本身推断出内容的类型,也就是说,你不一定能只看内容就

当我向REST服务发出带有JSON主体的POST请求时,我包括
内容类型:application/JSON;消息头中的字符集=utf-8
。如果没有这个头,我会从服务中得到一个错误。我还可以成功地使用
内容类型:application/json
,而无需
;字符集=utf-8
部分


charset=utf-8
到底做什么?我知道它指定了字符编码,但是没有它服务就可以正常工作。这种编码是否限制了邮件正文中可以包含的字符?

标题仅表示内容的编码内容。不一定能从内容本身推断出内容的类型,也就是说,你不一定能只看内容就知道如何处理它。这就是HTTP头的用途,它们告诉接收者他们(应该)正在处理什么类型的内容

内容类型:application/json;charset=utf-8
指定内容为JSON格式,采用utf-8字符编码。指定编码对于JSON来说有些冗余,因为JSON的默认(仅?)编码是UTF-8。因此,在本例中,接收服务器显然很高兴知道它正在处理JSON,并假设默认情况下编码为UTF-8,这就是它使用或不使用头的原因

此编码是否限制消息正文中可以包含的字符


不可以。你可以在标题和正文中发送任何你想要的内容。但是,如果两者不匹配,您可能会得到错误的结果。如果在标题中指定内容是UTF-8编码的,但实际上发送的是拉丁1编码的内容,则接收方可能会产生垃圾数据,试图将拉丁1编码的数据解释为UTF-8。当然,如果您指定您发送的是拉丁文编码的数据,并且您实际上正在发送,那么是的,您可以用拉丁文编码256个字符。

为了证实@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 xx xx xx  UTF-8
请注意,已被替换为。在第[8.1]节中,它撤回了@Drew之前引用的文本,并说:


我完全同意@deceze,但我想发展这一点,即“我从服务中得到了一个错误”问题的一部分

我们得到的此类错误为HTTP415

Http 415不支持的媒体类型错误

HTTP 415 Unsupported Media Type client错误响应代码表示服务器拒绝接受请求,因为负载格式为不受支持的格式

格式问题可能是由于请求指示的内容类型或内容编码,或者是直接检查数据的结果

换言之,这一点可以从中看出

  • 我们必须设置正确的内容类型,并且必须接受正确的内容类型 如图所示,添加
    内容类型:application/json
    接受:application/json
    。否则,它将假定为默认值

Dart http的实现过程中,由于“charset=utf-8”,所以我确信有几个实现支持这一点,以避免在从响应读取字节时使用“拉丁-1”回退字符集。
在我的例子中,我完全丢失了响应体字符串的格式,因此我必须手动将字节编码为utf8,或者在服务器的API响应中添加header“inner”参数。

我使用的是HttpClient,返回的响应头的内容类型为
应用程序/json
,我丢失了使用unicode的字符,如外语或符号,因为HttpClient默认为ISO-8859-1。因此,尽可能明确@WesternGun所提到的内容,以避免任何可能的问题


由于服务器无法为我处理请求的头字符集(
method.setRequestHeader(“accept charset”,“UTF-8”);
),所以无法处理,我必须以绘制字节的形式检索响应数据,并使用UTF-8将其转换为字符串。因此,建议显式使用,避免使用默认值。

有趣地看一看,根据,似乎根本没有支持的
字符集
参数,尽管它在实践中经常提供。
我知道它指定了字符编码,但没有它,服务可以正常工作。
“正常工作”并不总是意味着“现有的代码/配置是完成一件事的最正确的方法,涵盖了所有的关键情况”。这取决于在其他情况下可能不起作用的所有约定和假设。就我个人而言,我总是尽量明确。发送“charset”参数是不正确的,也是没有意义的。请参阅RFC 8259,第11节,最后一句。当然,在JSON中,您仍然可以使用转义序列(如
\u20AC
)表示非拉丁字符。根据JSON标准,您实际上不允许使用拉丁字符编码内容。JSON内容必须编码为unicode,可以是UTF-8、UTF-16或UTF-32(大端或小端)。application/JSON上没有字符集参数。@DanielLuna是对的,
application/JSON
必须采用ucs转换格式之一。此外,由于JSON的前四个字节是有限的,因此您始终可以知道它是8、16还是32,以及它的endian-ness.Event。如果它是冗余的,出于安全原因,您可能希望包含
charset=utf-8
:将JSON视为二进制格式而不是文本格式总是有帮助的。既然RFC7159已经淘汰了RFC4627,这说明
Implementations MUST NOT add a byte order mark to the beginning of a JSON text.