为什么';如果HTML5的默认字符编码是UTF-8,那么有必要在HTML5文档中指定字符编码吗?

为什么';如果HTML5的默认字符编码是UTF-8,那么有必要在HTML5文档中指定字符编码吗?,html,unicode,encoding,utf-8,character-encoding,Html,Unicode,Encoding,Utf 8,Character Encoding,我有以下HTML5文档: <!DOCTYPE html> <html> <head> </head> <body> <p>Beträge: 20€</p> </body> </html> 我尝试了以下HTML5代码: <!DOCTYPE html> <html> <head> <me

我有以下HTML5文档:

<!DOCTYPE html>
<html>
    <head> </head>
    <body>
        <p>Beträge: 20€</p>
    </body>
</html>
我尝试了以下HTML5代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <p>Beträge: 20€</p>
    </body>
</html>
据我所知,HTML5的默认字符编码是UTF-8。它的默认值意味着不应在
标记内显式指定它

因此,在我的第一个代码片段中,我跳过了代码
,但得到了一些奇怪的意外结果

然后,我尝试在
两个标记之间添加代码
,效果非常好,我得到了预期的结果

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

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

HTTP1.1要求浏览器应将所有文本视为ISO-8859-1,除非另有说明:

当没有显式字符集时 参数由“文本”的发件人、媒体子类型提供 类型定义为具有默认字符集值“ISO-8859-1”

同时,HTML5规定

如果传输层指定了编码,并且支持该编码,则返回该编码并中止这些步骤

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

如果你编码

Beträge: 20€
使用UTF-8,然后将其解码为ISO-8859-1,您将获得完全混乱的输出:

Beträge: 20â¬
正如下面的代码片段所示(Java并不重要):

浏览器确实会提醒您这一点。例如,Firefox在控制台中显示以下警告:

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

要获得正确的输出,您必须通过UTF-8手动覆盖ISO-8859-1(对于Firefox,它位于
视图下
->
文本编码下
->
Unicode
(而不是“
Western
”)


因此,总结一下:我甚至不知道它在哪里说“HTML5的默认字符编码是UTF-8”。它所说的似乎是:

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

因为语句“HTML5的默认字符编码是UTF-8”是错误的。该声明通过网站发布。但正如Marcel Dopita在上所写的那样,这是错误的,事实上,对于英语地区,它有一个“建议的默认编码”Windows-1252


有时会说“HTTP/1.1默认为ISO-8859-1”。这在1999年的标准(RFC2616)中是正确的,但在2014年的版本(RFC7230-7329)中是默认字符集,因此默认行为现在只是由HTML5建议指定的。此外,即使传输层确实指定了“iso-8859-1”,它也不是HTML5中的一个标签,并且表示它应该被视为Windows-1252的标签

@ricky3350的可能副本:链接的问题不能令人满意地回答我的问题。根据问题的答案,你提供了谁的链接,这意味着字符编码必须以某种方式在HTML5网页中指定。那么,为什么他们说UTF-8是HTML5中的默认字符编码呢。根据我的理解,默认的东西不需要明确指定,而是被认为是现成的。那么为什么HTML5文档中的字符编码不是这样呢?所以,请删除我问题上的重复标记。谢谢
Beträge: 20€
Beträge: 20â¬
new String("Beträge: 20€".getBytes("utf-8"), "iso-8859-1")
// result: Beträge: 20â¬