【问题标题】:application/* Content-Type and charset attributesapplication/* Content-Type 和 charset 属性
【发布时间】:2015-02-01 03:16:29
【问题描述】:
3.7.1 中的RFC-2616 状态:
当发送者没有提供明确的字符集参数时,媒体
“文本”类型的子类型被定义为具有默认字符集
通过 HTTP 接收时的“ISO-8859-1”值。
这就是为什么我通常使用例如text/plain; charset=utf-8 作为 Content-Type 标头。
application 类型的 MediaTypes 呢?
我经常看到和使用像Content-Type: application/xml; charset=UTF-8 这样的标题。 RESTeasy 2.3.7 然后强制客户端也在Accept 标头中发送字符集参数。否则它将以406 回答。 RESTeasy 3.0.6 在这里似乎更加宽容,所以我不确定这里的最佳做法是什么。
【问题讨论】:
标签:
rest
http
character-encoding
resteasy
【解决方案1】:
RFC 2616 在 2014 年 6 月被一组 RFC 淘汰,其中包含通用 HTTP 规范的是RFC 7213。请使用RFC editor 查看 RFC 的当前状态。
RFC 7213 明确指出(在附录 B 中):
文本媒体类型的默认 ISO-8859-1 字符集已
移除;默认值现在是媒体类型定义所说的任何内容。
另一方面,RFC 6657 在预料到这种变化的同时声明:
“text/plain”的默认“charset”参数值不变
来自 [RFC2046] 并保持为“US-ASCII”。
因此,如果您的数据不是 ASCII(= US-ASCII),您应该继续明确声明 charset 参数。
XML 规范的子句4.3.3 指定:
在没有外部字符编码信息的情况下(如
MIME 标头),以其他编码方式存储的已解析实体
比 UTF-8 或 UTF-16 必须以文本声明开头 [...]
包含编码声明
因此,对于通过 HTTP 传输的 XML,无论内容类型如何,都必须在 HTTP 标头或编码声明中明确设置编码,例如<?xml encoding='UTF-8'?>.
对于一般的application 类型,可能适用特定于类型的规则。字符编码与大多数 application 类型无关,因为这些类型定义了自己的编码方案,包括任何嵌入字符数据的编码。