12

如果在 Content-Type 标头中未指定字符集参数,则RFC2616 第 3.7.1 节似乎暗示 ISO8859-1 应假定用于子类型“text”的媒体类型:

当发送者没有提供明确的字符集参数时,“文本”类型的媒体子类型被定义为在通过 HTTP 接收时具有“ISO-8859-1”的默认字符集值。

除“ISO-8859-1”或其子集以外的字符集中的数据必须用适当的字符集值标记。

但是,我经常看到应用程序提供带有 Content-Type 值的 Javascript 文件,例如“application/x-javascript”(即没有字符集参数),即使这些脚本包含非 ASCII UTF-8 字符,如果解释这些字符会损坏为 ISO8859-1。

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

4

6 回答 6

15

我检查过的所有主要浏览器(IE、FF 和 Opera)都完全忽略了这部分的 RFC 规范

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

关于内容类型的一个小说明:只有文本有字符集。可以合理地假设浏览器处理 application/x-javascript 与处理 text/javascript 相同(IE6 除外,但这是另一个主题)。

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

默认情况下,Internet Explorer 使用服务器返回的 HTTP 内容类型中指定的字符集来确定此转换。如果未给出此参数,Internet Explorer 将使用文档中 meta 元素指定的字符集。如果没有指定元元素,它将使用用户的偏好。

来源:http: //msdn.microsoft.com/en-us/library/ms537500%28VS.85%29.aspx

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

本文提出了三种类型的自动检测方法来确定没有显式字符集声明的文档的编码。

来源http ://www.mozilla.org/projects/intl/UniversalCharsetDetection.html

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

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

来源http ://www.opera.com/docs/specs/opera9/

于 2010-02-27T22:47:11.380 回答
2

RFC 4329中所述,也application/javascript可以有一个charset参数。另一个问题是浏览器实现的处理。对不起,但未经测试。

于 2010-02-28T23:13:40.727 回答
2

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

HTML - 通过元标记

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

HTML5变体:

<meta charset="utf-8">

XML (XHTML, KML) - 通过XML 声明

<?xml version="1.0" encoding="UTF-8"?>

文本- 通过字节顺序标记。例如,对于UTF-8,十六进制文件的前三个字节:

EF BB BF

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

HTML - 通过字符引用

&#nnnn;
&#xhhhh;

XML - 通过字符引用

&amp;
&defined-entity;

JSON - 通过转义机制

\u005C
\uD834\uDD1E

现在,关于 HTTP 1.1 协议,RFC 2616 对 charset 这么说

“charset”参数与某些媒体类型一起使用来定义数据的字符集(第 3.4 节)。当发送者没有提供明确的字符集参数时,“文本”类型的媒体子类型被定义为在通过 HTTP 接收时具有“ISO-8859-1”的默认字符集值。除“ISO-8859-1”或其子集以外的字符集中的数据必须用适当的字符集值标记。有关兼容性问题,请参阅第 3.4.1 节。

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

于 2013-10-10T14:35:43.983 回答
1

RFC 4329将“application/javascript”媒体类型定义为“text/javascript”、“application/x-javascript”和其他类似类型的替代品。当没有明确的“charset”参数可用且数据前面没有 Unicode BOM 时,第 4.2 节将默认字符编码设置为 UTF-8。

于 2010-03-05T02:47:11.580 回答
0

它对 XMLHttpRequest 有点特别,在此处进行了描述:http: //www.w3.org/TR/XMLHttpRequest/

于 2010-02-24T12:27:48.510 回答
0

指出显而易见的:“application/x-javascript”不是“text”的子类型。

此外,RFC 2616 中的文本已过时。HTTP/1.1 的下一个修订版不会定义默认值。有关详细信息,请参阅 RFC 6657。

于 2010-02-24T13:27:49.483 回答