对于HTTP与内容类型提示字符数据,该字符集应当由客户假定响应,如果没有指定?
-
22-09-2019 - |
题
如果在Content-Type头没有指定字符集参数, RFC2616第3.7节0.1 似乎暗示ISO8859-1应假定为媒体类型亚型的“文本”:
当没有明确的字符集参数是 由发送方提供的,媒体亚型 “文本”类型的被定义为具有 的默认字符集值 “ISO-8859-1” 经由HTTP接收时。
数据中的字符集比其它 “ISO-8859-1”或其子集必须是 标记与适当的字符集 值。
然而,我照例看到服务了的内容类型的值Javascript文件如“应用程序/ x-的javascript”的应用(即,没有字符集PARAM),即使当这些脚本包含非ASCII UTF-8字符,这将是腐败如果解释为ISO8859-1。
这似乎并不造成问题给客户。客户如何知道解释字节为UTF-8?是否有其他字符的数据亚型意味着UTF-8应该是默认的规则?其中这个记录?
解决方案
我已经检查了所有主要的浏览器(IE,FF和Opera)完全的忽略RFC规范强>在这一部分。
如果您有兴趣的算法来自动检测通过数据的字符集,看看的Mozilla火狐链路。
就有关内容类型的小记:仅文本具有字符集即可。这是合理的,因为它们处理文本/ JavaScript来假定浏览器手柄应用程序/ x-JavaScript的相同(除了IE6,但这是另一个主题)。
<强>的Internet Explorer 强>将使用默认的字符集(可能储存在注册表中),如所指出的:
默认情况下,Internet Explorer使用 字符集指定的HTTP 内容类型由服务器返回到 确定这个翻译。如果这 参数没有给出,互联网 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会尝试自动检测编码,使用该域名,看看剧本是CJK脚本,如果是其中之一。歌剧也可以自动检测UTF-8。
其他提示
如 RFC 4329 所描述的,也application/javascript
可以具有charset
参数。另一个问题是浏览器实现的处理。很抱歉,但未经测试。
在charset
参数的由于缺少,字符编码可以在含量强>指定。这里有一些办法采取几个内容类型:
<强> 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 强> - 通过字符引用:
&
&defined-entity;
<强> JSON 强> - 通过逃逸机制:
\u005C
\uD834\uDD1E
现在,相对于该HTTP 1.1协议, RFC 2616表示,这关于字符集:
在“字符集”参数用于与某些媒体类型来定义 字符集的数据的(第3.4节)。当没有明确的字符集 参数由发送方提供的,“文本”类型的媒体子类型 被定义为具有“ISO-8859-1”的默认字符集值时 通过HTTP接收。数据性格比“ISO-8859-1”设置或其他 其子集必须用合适的字符集的值来标记。看到 对于兼容性问题3.4.1节。
所以,我上面的解释是,一个的不能的假设默认字符集的除了的该类型的媒体子类型“文本”。当然,我们生活在现实世界和实施者并不总是遵守规则。正如接受的答案描述,各种网页浏览器厂商已经实现了自己的战略来确定文件的字符集时,它是没有明确规定。可以假设其他客户端(例如,谷歌地球)也实现了自己的策略,那供应商
RFC 4329 定义了 “应用程序/ JavaScript的” 媒体类型作为“文本/ JavaScript的”,“应用程序/ x-的javascript”,以及其他相似类型的替代品。第4.2节规定的默认字符编码为UTF-8时,没有明确的“字符集”参数可用,并且没有Unicode BOM是存在于数据的前部。
这对XMLHttpRequest的有点特殊,并且这里描述: http://www.w3.org / TR / XMLHttpRequest的/
指出了明显的:“应用程序/ x-JavaScript的”不是“文本”的子类型
另外,在RFC 2616的文本已经过时。 HTTP的下一版本/ 1.1不会定义默认。参见RFC 6657进一步的信息。