HTML5 是不是需要“字符集”元标记?
Posted
技术标签:
【中文标题】HTML5 是不是需要“字符集”元标记?【英文标题】:Is the "charset" meta tag required with HTML5?HTML5 是否需要“字符集”元标记? 【发布时间】:2013-01-18 03:01:43 【问题描述】:W3C “html5 differences from HTML4” 工作草案指出:
对于 HTML 语法,作者需要声明字符编码。
“需要”是什么意思?
显然,浏览器仍然会在没有charset
元标记的情况下呈现 HTML5。如果没有指定编码,浏览器会使用哪种编码?
基本上,我想知道是否真的需要包含<meta charset="">
,或者浏览器是否在 99% 的情况下都会使用正确的编码。
【问题讨论】:
我 guess 字符集如果出现在Content-Type
响应标头中,也可以被视为“已声明”。
如果有人感兴趣,我也碰巧看到一个页面,解释了排除编码如何导致 XSS 漏洞:openmya.hacker.jp/hasegawa/security/utf7cs.html
charset
是元标记吗? charset
不是(文字)meta
标记的 属性 吗?
【参考方案1】:
自 1999 年大部分 W3C 规范问世以来,标准机构已推动供应商(服务器、浏览器和文档应用程序的制造商)遵循编码规则并使用元标记来帮助确定意图。
但由于贪婪、糟糕的浏览器设计和其他因素,多年来一直遵循规范的人很少。结果,我们有一个破碎的系统。一些供应商,如 Mozilla,自 2001 年以来一直遵循元标记标准,而其他供应商,如 Microsoft 和 Google,则没有。
因此,所有 Web 开发人员都应在构建所有网页时使用应急设计,并使用元标记和其他标准标记来支持网页构建中使用的正确字符编码,尽管对此类的支持不一致标签。换句话说,使用两种元标记类型(<meta charset="UTF-8">
和 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
),尽管实际上此类标记很少会决定现代用户代理如何编码或解释现代网页。
确定浏览器在解释页面时使用什么编码的主要驱动程序通常基于创建网页时使用的软件(如上面提到的),越来越多的是 UTF-8。这只是Unicode 的标准编码方案,目前在创建 HTML5 网站时很流行。然后,用户的浏览器可能会跳过元标记并检查页面以猜测作者的编码意图。然而,主要驱动程序是 Web 服务器,其 HTTP 响应标头通常会告诉浏览器使用的编码类型,对于 HTML5 页面来说,它始终是 UTF-8。因为旧网页中使用的旧 ASCII(前 127 个字符)在 99.99% 的情况下完全可以转换为 UTF-8,所以浏览器对所有内容都进行了 UTF-8 编码和解码。由于所有这些后备设计,如今通常根本不需要使用元标记,并且在现代网页解析中完全忽略了。
元标签的更多历史......在 2000 年,整个元标签的争论比今天糟糕得多。将HTML 4 与嵌入的 Unicode 字符一起使用通常意味着页面既不能正确编码也不能正确呈现,尽管服务器 HTTP 标头、字符实体的使用和元标记只是因为当时的现代浏览器没有不遵循标准并且没有查看元标记、页面编码或编码字符实体。这就是为什么要在失败的标准采用中与所有复杂的支持和系统组合作斗争,最好使用所有技术组合来增加正确呈现网页的“可能性”。
当时我们学到了宝贵的一课:Web 标准 公司永远不会始终如一地遵循。当私营行业没有一致采用标准时,最好始终以各种可能的形式使用所有形式和版本的标记,以最大限度地利用这些标准的各种形式在许多不同的设备上正确查看您的页面,即使今天它们无关紧要(因为浏览器现在解析页面并自行确定编码)。
这应该是用于所有网页设计的策略,直到我们以某种方式强制普遍采用 Web 标准,而现在移动用户代理和HTML5 越来越不可能,这迫使我们再次放弃许多 XML 标准这将强制执行更好的标记设计。
【讨论】:
【参考方案2】:尽早指定文档的字符集很重要(通过Content-Type
标头或META
标签),否则浏览器将在解析文档之前确定编码,这可能negatively impact the page load time.
【讨论】:
【参考方案3】:根据 Google PageSpeed 浏览器扩展,在元元素中声明字符集“禁用 IE8 的先行功能”,这显然会强制它以串行方式下载所有内容。
我的理解是<meta charset-"utf-8">
是有效 HTML5 所必需的,但这就是我开始在这里浏览的原因。
规范草案对我来说似乎很清楚,因为我通过 .htaccess
添加 HTTP 标头,我将开始将其省略...即使我很想不这样做,只是让 IE8 用户受苦多一点。
谢谢。
@Jules Mazur 你对这些观点有什么参考吗?我所做的大部分工作都是 SEO 和可访问性对我来说很重要,如果是这种情况,我非常愿意离开元声明。
【讨论】:
【参考方案4】:不必包含<meta charset="blah">
。如规范所述,服务器也可以使用 HTTP Content-Type
标头或通过在下载文件的开头包含 Unicode BOM 来指定字符集。
如果没有指定,今天的大多数 Web 服务器将在 HTML 文本数据的 Content-Type
标头中发回一个字符集。如果 Web 服务器未发回带有 Content-Type
标头的字符集并且,则该文件不包含 BOM并且该页面不包含 <meta charset="blah">
声明时,浏览器将具有通常基于主机语言设置的默认编码。如果这与文件的实际字符编码不匹配,那么某些字符会显示不正确。
浏览器会在 99% 的情况下使用正确的编码吗?如果您的页面是 UTF-8,可能。如果没有,可能不会。
W3C 提供了一个document outlining the precendence rules for the three methods,表示顺序是 HTTP 标头、BOM,然后是文档内规范(元标记)。
【讨论】:
如果Content-type
、BOM
和<meta charset="">
都有不同的值,那么优先顺序是什么?
HTTP 标头,BOM,后跟元标记。我将使用从 W3C 找到的链接来更新答案,以回答这个问题。
这真的很有趣。我原以为元标记的目的是覆盖其他所有内容。似乎实际上很难出现需要元标记的情况。我错过了什么吗?
@twiz,当服务器发送没有charset
参数的Content-Type
标头时,必须使用meta
标记来声明编码并且您无法影响这一点(并且您没有使用UTF -8)。这种情况并不少见。此外,如果页面由用户本地保存,则meta
标签是相关的。 (稍后打开时,将没有 HTTP 标头。)
@JukkaK.Korpela 我对编码知之甚少,所以想知道,字符集可能被遗漏的常见场景的示例是什么?以上是关于HTML5 是不是需要“字符集”元标记?的主要内容,如果未能解决你的问题,请参考以下文章
X-UA-Compatible 元标记应该在字符集标记之前还是之后