我有以下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的标签。