如果 HTML5 的默认字符编码是 UTF-8,为什么需要在 HTML5 文档中指定字符编码?



我有以下HTML5文档:

<!DOCTYPE html>
<html>
<head> </head>
<body>
<p>Beträge: 20€</p>
</body>
</html>

上述鳕鱼的输出如下:

Beträge: 20€

我尝试了以下HTML5代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<p>Beträge: 20€</p>
</body>
</html>

上面的代码给了我以下输出,正如我所期望的那样:

Beträge: 20€

据我所知,HTML5的默认字符编码是UTF-8。它是默认值,这意味着不应在标记<meta>中显式指定它。

所以,在我的第一个代码片段中,我跳过了代码<meta charset="UTF-8">但我得到了一些奇怪的意外结果。

然后,我尝试在<head>对标签之间添加代码<meta charset="UTF-8">,它工作得很好,我得到了预期的结果。

所以,我的问题是,既然HTML5中的默认字符编码已设置为UTF-8,为什么如果没有明确指定它就不起作用?

为什么需要在HTML5文档中指定字符编码"UTF-8">

这个答案依赖于一些现在已经过时的文档,参见 jon1000 的 更新的答案。 (感谢@blazee在评论中指出这一点(我会离开这个 在这里回答,因为关于字符串如何"Beträge: 20€"的部分是 在各种编码中变异似乎仍然准确。


HTTP1.1 指定浏览器应将所有文本视为 ISO-8859-1,除非另有说明 (这引用了 RFC-2616,但后来被取代,请参阅@jon1000的答案(

当没有显式字符集时 参数由发送方提供,媒体子类型的"文本" 类型定义为具有默认字符集值"ISO-8859-1">

同时,HTML5 指定

如果传输层指定了编码,并且该编码受支持,请以确定的置信度返回该编码,并中止这些步骤。

因此,HTTP1.1默认为ISO-8859-1,并覆盖其他所有内容

如果编码

Beträge: 20€

使用 UTF-8,然后将其解码为 ISO-8859-1,您将获得确切的乱码输出:

Beträge: 20â¬

正如以下代码片段所演示的那样(Java,并不重要(:

new String("Beträge: 20€".getBytes("utf-8"), "iso-8859-1")
// result: Beträge: 20â¬

浏览器实际上确实会警告您。 例如,Firefox 在控制台中显示以下警告:

未声明 HTML 文档的字符编码。如果文档包含 US-ASCII 范围之外的字符,则文档在某些浏览器配置中将以乱码文本呈现。页面的字符编码必须在文档或传输协议中声明。

要获得正确的输出,您必须用 UTF-8 手动覆盖 ISO-8859-1(对于 Firefox,它在View->Text Encoding->Unicode下(而不是"Western"((。


所以,总结一下:我甚至没有看到它在哪里说"HTML5 的默认字符编码是 UTF-8"。它所说的一切似乎都是:

鼓励作者使用 UTF-8。一致性检查器可能会建议作者不要使用旧版编码。

因为语句"HTML5的默认字符编码是UTF-8"是错误的。 该声明由这样的网站分发。 但正如Marcel Dopita在Don't be dited by w3schools中所写的那样,UTF-8不是默认的HTML5字符集,它是错误的,事实上,W3C建议有一个"建议的默认编码"Windows-1252用于英语语言环境。

有时有人说"HTTP/1.1默认为ISO-8859-1"。 这在 1999 年标准 (RFC 2616( 中是正确的,但在 2014 版 (RFC 7230-7329( 中,默认字符集已被删除,因此默认行为现在仅由 HTML5 建议指定。 此外,即使传输层确实指定了"iso-8859-1",它也不是HTML5中支持的编码,编码规范规定应将其视为Windows-1252的标签。

最新更新