我正在尝试优化我的框架处理HTML5页面生成的方式。现在,我所做的是在<head>
标记后面插入一个<meta charset="utf-8"/>
,因此它是要指定的第一个元素(因此,当我传递<title>
标记和其他页面元素时,它已经被定义为用UTF-8编码)。
问题是,我正在阅读一些关于网站性能优化的书籍,其中大多数都建议通过Content-type
声明指定编码,而不是插入<meta>
块。
W3C关于字符编码检测的文档(第8.2.2.1节)指出,本质上,HTTP标头的优先级高于任何显式声明,除非用户通过用户代理声明了内容类型的覆盖。
然而,W3C验证器(这就是我用来调试HTML代码输出的原因)并没有抱怨,而是警告我<meta charset="utf-8"/>
块的缺失,从而鼓励我放置它(它说,如果要保存渲染的页面,这是特别推荐的,但事实并非如此,但仍然……这让我有点困惑)。
问题是…如何确保页面始终指定为UTF-8编码?我必须声明HTTP标头和<meta>
标记,还是仅声明HTTP标头?
我对它的描述再好不过了:HTML之路5:字符编码
它是一个7步算法;步骤4有2个子步骤,第一个有7个分支,其中一个有8个子步骤,其中一个子步骤实际上链接到一个单独的算法,该算法本身有7个步骤。。。这种情况持续了一段时间。它的要点是
- 用户覆盖-你对此没有影响
-
"内容类型"字段中的HTTP"字符集"参数在PHP代码中,即:
header('Content-Type: text/html;charset=UTF-8');
-
HTML文档中任何其他数据之前的字节顺序标记-我不能建议实际使用该功能。如果您愿意,只需相应地保存文件,但不要期望
header()
调用再完美地工作。另一种选择是用PHP手动输出BOM,即:echo "'xEF'xBB'xBF"; # UTF-8 BOM
但即使这样,我也不建议输出BOM,因为这是对输出的向后不兼容的更改。这些指南是用来阅读的,而不是用来输出的。
-
具有"charset"属性的META声明-请这样做,这是很好的做法。在HTML 5中,即:
<meta charset="UTF-8">
-
META声明,其中"http-equiv"属性设置为"Content-Type",值设置为"charset"-为什么不呢?!在HTML5中,这将是:
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
- 未指定的启发式分析-你对此没有任何影响
这些就是要点。我的建议如下:
- 检查您的Web服务器在提供HTML时是否发送了正确的标头
- 拥有HTML和这些元标记,这样就可以将HTML文件保存在磁盘上,稍后在浏览器中打开(离线、存档)
- 如果使用UTF-8,请不要将BOM放入文档中
- 不要使用UTF-16或UTF-32,如果使用Unicode,请使用UTF-8
如果您针对的是完全不知道编码的系统,请使用US-ASCII并将不属于它的所有其他内容屏蔽为HTML实体。
注意:此实体建议用于输出到浏览器,而不是存储,存储属于您的领域,请确保您在处理存储时了解编码。不要使用HTML实体,例如,当您在mysql数据库中写入HTML时,当您并不真正需要它时(例如,HTML链接中的
&
)