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

6 html unicode encoding utf-8 character-encoding

我有以下HTML5文档:

\n\n
<!DOCTYPE html>\n<html>\n    <head> </head>\n    <body>\n        <p>Betr\xc3\xa4ge: 20\xe2\x82\xac</p>\n    </body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n\n

上述 cod 的输出如下:

\n\n
Betr\xc3\x83\xc2\xa4ge: 20\xc3\xa2\xe2\x80\x9a\xc2\xac\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试了下面的HTML5代码:

\n\n
<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset="UTF-8">\n    </head>\n    <body>\n        <p>Betr\xc3\xa4ge: 20\xe2\x82\xac</p>\n    </body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的代码给出了我所期望的以下输出:

\n\n
Betr\xc3\xa4ge: 20\xe2\x82\xac\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n

And*_*kin 6

\n

这个答案依赖于一些现在已经过时的文档,请参阅jon1000 的答案进行更新。(感谢 @blazee 在评论中指出这一点)我将把这个答案留在这里,因为关于如何字符串"Betr\xc3\xa4ge: 20\xe2\x82\xac"在各种编码中发生变化似乎仍然准确。

\n
\n
\n

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

\n
\n

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

\n
\n

同时,HTML5规定:

\n
\n

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

\n
\n

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

\n

如果你编码

\n
Betr\xc3\xa4ge: 20\xe2\x82\xac\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
Betr\xc3\x83\xc2\xa4ge: 20\xc3\xa2\xc2\xac\n
Run Code Online (Sandbox Code Playgroud)\n

如以下代码片段所示(Java,并不重要):

\n
new String("Betr\xc3\xa4ge: 20\xe2\x82\xac".getBytes("utf-8"), "iso-8859-1")\n// result: Betr\xc3\x83\xc2\xa4ge: 20\xc3\xa2\xc2\xac\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

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

\n
\n

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

\n
\n

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

\n
\n

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

\n
\n


jon*_*000 6

因为“HTML5的默认字符编码是UTF-8”的说法是错误的该声明由此类网站发布。但正如 Marcel Dopita 在Don\xe2\x80\x99t be follyed by w3schools 中所写,UTF-8 不是默认的 HTML5 字符集,这是错误的,事实上W3C 建议对英语有一个“建议的默认编码”Windows-1252语言环境。

\n\n

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

\n