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

时间:2018-09-16 06:01:55

标签: html5 unicode encoding utf-8 character-encoding

我正在关注 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">,但是我得到了一些奇怪的意外结果。

然后,我尝试通过在<meta charset="UTF-8">对标签之间添加代码<head>来使其工作正常,并得到了预期的结果。

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

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

2 个答案:

答案 0 :(得分:3)

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

  

没有显式字符集时   参数由发送者提供,“文本”的媒体子类型   类型定义为具有默认字符集值“ 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-> {{1}下}(而不是“ Unicode”)。


因此,可以得出结论:我什至都没有看到“ HTML5的默认字符编码为UTF-8” 。它说的似乎全部是:

  

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

答案 1 :(得分:0)

因为语句“ HTML5的默认字符编码为UTF-8”是错误。该声明由网站like this发布。但是正如Marcel Dopita在Don’t be fooled by w3schools, UTF-8 is not the default HTML5 charset上所写的那样,这是错误的,并且实际上W3C recommendation具有Windows-1252的“建议的默认编码”,适用于英语语言环境。

有时会指出“ HTTP / 1.1默认为ISO-8859-1”。在1999年标准(RFC 2616)中确实如此,但在2014年版本(RFC 7230-7329)中,默认字符集has been removed如此,因此默认行为仅由HTML5建议指定。同样,即使传输层确实指定了“ iso-8859-1”,它也不是HTML5中的supported encoding,并且encoding specification说应将其视为Windows-1252的标签。