'charset=iso-8859-1'与<!DOCTYPE HTML>一起使用会引发警告。

10

我刚刚使用W3C验证器验证了一个HTML文档,发现如果我使用:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

使用:

<!DOCTYPE HTML>
  • 它抛出一个警告:第4行,第72列:使用windows-1252而不是声明的编码iso-8859-1。

然而,如果我使用以下内容,则问题可以解决:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

我真的不太明白发生了什么。而且,我甚至不知道如何使用DOCTYPE标签,只是从网上复制粘贴了一个。
- 为什么会发生这种情况? - 我应该如何使用 DOCTYPE标签?
6个回答

20
Changing the DOCTYPE仅是关闭警告,而不是实际修复任何内容。 iso-8859-1windows-1252是非常相似的编码。它们之间唯一的区别在于与从0x80到0x9F的32个字节值相关联的字符,在iso-8859-1中被映射为控制字符,在windows-1252中被映射为一些有用的字符,例如欧元符号。
控制字符在HTML中是无用的,Web作者经常错误地声明iso-8859-1,然后使用其中一个或多个这些32个值,就好像他们正在使用windows-1252一样,因此当浏览器看到声明iso-8859-1字符集时,将自动更改为windows-1252

验证器只是警告您会发生这种情况。如果您没有使用任何32字节值,则可以简单地忽略警告 - 这不是错误。如果您正在使用,并且确实希望使用字节值的iso-8859-1解释而不是windows-1252解释,则您正在做错事情。

同样,这种切换在任何DOCTYPE的浏览器中都会发生,只是HTML5验证器比HTML4验证器更有帮助,告诉您它正在告诉您什么。


7

几点需要注意:

  1. 任何HTML5验证都应该持保留态度。规范仍在积极发展中,不是所有内容都已经确定。
  2. 您正在使用那个meta标签的HTML4语法。请尝试 <meta charset="iso-8859-1">

话虽如此,在今天的时代,HTML验证器并没有太多用处。

但显然,HTML4的默认值为iso=8869-1。 话虽如此,HTML5的默认字符集为UTF-8。

有关HTML5文档类型的更多信息可以在John Resigthis post中找到。


1
utf-8 是 HTML5 的首选字符集。您可以在此处找到更多信息:https://developer.mozilla.org/en/HTML/Element/meta#attr-charset - Andrew Stewart
1
这个注释的意思是什么?:“在当今时代,HTML验证器并没有那么重要。” - Wesley Murch
1
@Madmartigan 大多数浏览器在解释 HTML 方面使用的规则与 W3 验证器不同。例如,将 <title> 放在 <body> 中而不是 <head> 中。世界上没有任何浏览器会对此有问题!然而,验证器会抱怨你不应该这样做。(也就是说,你真的不应该这样做,但你明白我的意思。为了浏览器兼容性,在许多不同的浏览器中进行测试比确保您的源代码通过验证器更重要。) - Mr Lister
10
我完全不同意:验证器可以捕捉到肉眼无法察觉的问题。无效的HTML是一个引起意外、不一致行为的好方法,因为每个浏览器可能会以不同的方式处理它。例如:未关闭或不匹配的标记、无效或破损的属性、引号放错位置、未终止的实体字符串、不当的嵌套、缺少必需的属性等等。我不确定你用那个例子想表达什么意思。 - Wesley Murch
据我所知,HTML的解析方式在2007年已经标准化。 - Timo Huovinen

3
它抛出了一个警告:第4行,第72列:使用windows-1252而不是声明的编码iso-8859-1。这意味着文件在创建时采用了Windows-1252编码(也称为Western Windows 1252或CP1252),而您的charset声明说“嘿,请使用ISO 8859-1读取此文件”,但实际上文件所使用的编码并非如此。 正是为此而存在。它的存在是为了声明您正在发送/读取/使用的文件的编码,以便例如浏览器读取文档时知道文件所使用的编码。
详细来说,您声明了以下字符集:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

但是,您正在验证的文件实际上是使用Windows-1252编码的。为什么呢?怎么回事呢?请检查您使用的文本编辑器以及它用于保存文件的编码方式。如果编辑器可以配置更改编码,请选择您想要使用的编码方式。

关于HTML5

使用

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

或者

<meta charset="iso-8859-1">

对于HTML5,两种方式都有效。请参阅<meta charset="utf-8"> vs <meta http-equiv="Content-Type">


<meta>标签的格式是有效的。但是其值无效。对于HTML5,该值必须为utf-8。charset属性指定文档使用的字符编码。这是一个字符编码声明。如果存在该属性,则其值必须是与字符串"utf-8"不区分大小写的ASCII匹配。 —— HTML5规范 - Nathaniel
@Nathaniel 请阅读原帖的问题。这个答案是在问题的背景下给出的,这就是为什么它使用了那个字符集。UTF-8 是推荐和“最佳实践”,但只要你遵守它,也可以自由地使用其他字符集,这意味着你发送的文件实际上是以该字符集保存的。请阅读 w3 的答案 https://www.w3.org/International/questions/qa-html-encoding-declarations.en#nonutf8 - delroh

1

请按照以下步骤操作:

ISO 8859-15。是的,-15,这样就可以正常工作了。


iso-8859-15iso-8859-1 不同。如果它们相同,那么对于 iso-8859-15windows-1252 来说,只有前两行 会有所不同(但在 0x80..0x9f 范围之外也会有所不同)。 - jfs
"ISO 8859-15" 不是一个操作。然而,原帖作者已经离开了 ("最后一次出现超过6年前")。 - Peter Mortensen

1
W3C验证器提供使用哪种编码的选项。您已经在文档中指定了编码,因此在运行验证器后,您应该会在信息顶部块中看到“编码:iso-8859-1”。
在其右侧,有一个下拉菜单。将选择从“(自动检测)”更改为“iso-8859-1(西欧)”。然后验证器将使用 ISO 8859-1而不是其自己的选择,并且您将不会收到错误信息。

0
不要过于依赖验证器。通常会有太多Internet Explorer的变通方法,特别是在CSS内容中,这些方法可能会使验证器出错。如果您的网页在所有浏览器中都能正常运行,并且您的客户满意,那么一些验证器的说法就无关紧要了。
如果您指定了HTML5文档类型,则应始终与meta字符集属性保持一致。请尝试使用以下内容来制作您的网页:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
</head>

<body>
</body>
</html>

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