对于包含建议字符数据的内容类型的HTTP响应,如果未指定字符集,客户端应采用哪个字符集?

对于包含建议字符数据的内容类型的HTTP响应,如果未指定字符集,客户端应采用哪个字符集?,http,default,content-type,character-encoding,rfc2616,Http,Default,Content Type,Character Encoding,Rfc2616,如果在内容类型标题中未指定字符集参数,似乎意味着子类型“text”的媒体类型应采用ISO8859-1: 当没有显式的字符集参数时 由发件人提供,媒体子类型 “文本”类型的 默认字符集值为 通过HTTP接收时为“ISO-8859-1” 字符集中的数据,而不是 “ISO-8859-1”或其子集必须 用适当的字符集标记 价值观 但是,我经常看到一些应用程序提供具有“application/x-Javascript”(即无字符集参数)等内容类型值的Javascript文件,即使这些脚本包含非ASCII

如果在内容类型标题中未指定字符集参数,似乎意味着子类型“text”的媒体类型应采用ISO8859-1:

当没有显式的字符集参数时 由发件人提供,媒体子类型 “文本”类型的 默认字符集值为 通过HTTP接收时为“ISO-8859-1”

字符集中的数据,而不是 “ISO-8859-1”或其子集必须 用适当的字符集标记 价值观

但是,我经常看到一些应用程序提供具有“application/x-Javascript”(即无字符集参数)等内容类型值的Javascript文件,即使这些脚本包含非ASCII UTF-8字符,如果解释为ISO8859-1,这些字符将被损坏


这似乎不会给客户带来问题。客户端如何知道将字节解释为UTF-8?是否有其他字符数据子类型的规则暗示UTF-8应为默认值?这是在哪里记录的?

它对于XMLHttpRequest有点特殊,在这里进行了描述:

指出了显而易见的一点:“应用程序/x-javascript”不是“文本”的子类型


此外,RFC 2616中的文本已过时。HTTP/1.1的下一个版本将不会定义默认值。有关更多信息,请参见RFC 6657。

我检查过的所有主要浏览器(即,FF和Opera)完全忽略本部分中的RFC规范

如果您对通过数据自动检测字符集的算法感兴趣,请查看链接

关于内容类型,请注意:只有文本具有字符集。有理由假设浏览器处理application/x-javascript与处理text/javascript相同(除了IE6,但这是另一个主题)

Internet Explorer将使用默认字符集(可能存储在注册表中),如下所述:

默认情况下,Internet Explorer使用 HTTP中指定的字符集 服务器返回给的内容类型 确定此翻译。如果这 参数未给定,请访问Internet 资源管理器使用字符集 由中的元元素指定 文件它使用用户的 首选项如果未指定元元素 指定的

资料来源:

Mozilla Firefox尝试自动检测字符集,如下所述:

本文介绍了三种类型的自动检测方法,用于在没有显式字符集声明的情况下确定文档的编码

资料来源:

Opera也使用自动检测,如文件所述:

如果传输协议提供编码名称,则使用该名称。如果没有,Opera将在页面上查找字符集声明如果缺少此项,Opera将尝试自动检测编码,使用域名查看脚本是否为CJK脚本,如果是,则查看哪个脚本。Opera还可以自动检测UTF-8


来源:

如中所述,
application/javascript
也可以有一个
charset
参数。另一个问题是浏览器实现的处理。很抱歉,但未测试。

将“应用程序/javascript”媒体类型定义为“文本/javascript”、“应用程序/x-javascript”和其他类似类型的替换。第4.2节在没有明确的“字符集”参数可用且数据前面没有Unicode BOM时,将默认字符编码设置为UTF-8。

在缺少
charset
参数的情况下,可以在内容中指定字符编码。以下是几种内容类型采取的一些方法:

HTML-通过:

与与文档相关联的字符集不同,还请注意,非ASCII字符可以使用各种方法通过ASCII字符序列进行编码:

HTML-通过:

XML-通过:

JSON-通过:

现在,关于HTTP 1.1协议:

“charset”参数与某些媒体类型一起用于定义 数据的字符集(第3.4节)。当没有显式字符集时 参数由“文本”类型的发件人、媒体子类型提供 定义为在以下情况下具有默认字符集值“ISO-8859-1” 通过HTTP接收。除“ISO-8859-1”或 它的子集必须用适当的字符集值进行标记。看见 第3.4.1节了解兼容性问题


因此,我对上述内容的解释是,除了“文本”类型的媒体子类型之外,不能假设默认字符集。当然,我们生活在现实世界中,实现者并不总是遵循规则。如中所述,在未明确指定文档字符集时,各种web浏览器供应商都实施了自己的策略来确定文档字符集。我们可以假设其他客户(如Google Earth)的供应商也实施他们自己的策略。

同意-所以问题是:除了“文本”之外,是否还有字符数据子类型的规则?如果是这样的话,这是在哪里记录的?没有一般规则,因为媒体类型可能不是基于字符的…问题是关于那些建议字符数据的媒体类型。如果没有一般规则,是否有针对不同媒体类型的特定规则?它们记录在哪里?必须至少有一些规则,因为客户端必须决定如何解释字节。具体规则应该在媒体类型注册指向的文档中,例如application/xml。我对第4.2节的解释不是假设UTF-8是默认字符编码。此外,第4节的介绍说明:“实现如何确定字符编码方案可能会受到超出本节范围的处理规则的约束
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta charset="utf-8">
<?xml version="1.0" encoding="UTF-8"?>
EF BB BF
&#nnnn;
&#xhhhh;
&amp;
&defined-entity;
\u005C
\uD834\uDD1E