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

5

I've following HTML5 document :

<!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。这意味着在 标签内不需要显式指定字符编码。
因此,在我的第一个代码片段中,我跳过了代码 。但我得到了一些奇怪的意外结果。
然后,我尝试在 标签对之间添加代码 ,它完美地工作了,我得到了预期的结果。
那么,我的问题是,既然 HTML5 的默认字符编码已经设置为 UTF-8,为什么如果没有显式指定就不能正常工作?
为什么需要在 HTML5 文档中明确指定字符编码 "UTF-8"?

@ricky3350:链接的问题没有令我满意地回答我的问题。根据您提供的链接中的答案,它说字符编码必须以某种方式在HTML5网页中指定。那么,为什么他们说UTF-8HTML5的默认字符编码呢?据我理解,默认的东西不需要明确说明,而是被认为是随时可用的。那么为什么在HTML5文档中字符编码不是这种情况呢?所以,请取消对我的问题的重复标记。谢谢。 - user10318083
2个回答

6

这个答案依赖于一些现在已过时的文档,请参考jon1000的回答进行更新。(感谢@blazee在评论中指出)我将保留此答案,因为关于字符串"Beträge:20€"在各种编码中如何变异的部分仍然准确。


HTTP1.1规定浏览器应将所有文本视为ISO-8859-1,除非另有说明(此处引用了RFC-2616,但后来被取代,请参见@jon1000的回答):

当发送方未提供显式字符集参数时,“text”类型的媒体子类型被定义为具有默认字符集值“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 范围之外的字符,则在某些浏览器配置中,文档将呈现为乱码。页面的字符编码必须在文档或传输协议中声明。”
要获得正确的输出,您必须手动覆盖 ISO-8859-1 通过 UTF-8(在 Firefox 的情况下,它位于“查看”->“文本编码”->“Unicode”(而不是“西方”))。
因此,总的来说:我看不出它甚至表明“HTML5的默认字符编码是UTF-8”。它似乎只是说:
作者被鼓励使用UTF-8。符合性检查器可能会建议作者不要使用传统编码。

1
这个答案在这部分是错误的:“因此,HTTP1.1默认为ISO-8859-1,并覆盖其他所有内容。”算法更加复杂,取决于本地设置,如@jon1000的答案所提供的。 - blazee

5
因为“HTML5的默认字符编码是UTF-8”这个说法是错误的。这个说法被像这样的网站传播。但正如Marcel Dopita在不要被w3schools愚弄,UTF-8不是默认的HTML5字符集中所写,它是错误的,事实上W3C建议对于英语环境下的默认编码是Windows-1252。
有时会说“HTTP/1.1默认使用ISO-8859-1编码”。这在1999年的标准(RFC 2616)中是正确的,但在2014年版本(RFCs 7230-7329)中,默认字符集已被删除,因此现在的默认行为仅由HTML5建议指定。此外,即使传输层确实指定了“iso-8859-1”,它也不是HTML5中支持的编码编码规范表明它应该被视为Windows-1252的标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接