PHP&;HTML5:UTF-8文档声明,带有<;meta>;标记或通过header()函数


PHP & HTML5: UTF-8 document declaration with <meta> tag or through the header() function?

我正在尝试优化我的框架处理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链接中的&amp;

相关文章: