PHP&amp; HTML5:带有<meta />标签或header()函数的UTF-8文档声明?

时间:2012-08-05 20:54:50

标签: php html5 utf-8 header

我正在尝试优化我的框架处理HTML5页面生成的方式。现在,我所做的是在<meta charset="utf-8"/>标记之后插入<head>,因此它是第一个要指定的元素(所以当我传递<title>标记和页面的其余部分时元素,它已被定义为以UTF-8编码。

问题是我正在阅读一些有关网站性能优化的书籍,其中大多数建议通过Content-type声明指定编码,而不是插入<meta>块。

关于字符编码检测的W3C文档(第8.2.2.1节)基本上说,如果用户通过用户代理声明了对内容类型的覆盖,则HTTP头的优先级高于任何显式声明EXCEPT。

然而,W3C验证器(这就是我用来调试我的HTML代码输出的原因)没有抱怨,但警告我没有<meta charset="utf-8"/>块,因此鼓励我把它(它说它是特别推荐如果要保存渲染页面,情况并非如此,但仍然......它让我感到困惑。)

问题是......如何确保页面始终指定为UTF-8编码?我必须声明HTTP标头和<meta>标签,还是只声明HTTP标头?

1 个答案:

答案 0 :(得分:5)

我无法更好地描述它:The Road to HTML 5: character encoding

  

这是一个7步算法;步骤4有2个子步骤,其中第一个有7个分支,其中一个有8个子步骤,其中一个实际链接到一个单独的算法,它本身有7个步骤...它会持续一段时间。它的要点是

  • 用户覆盖。 - 您对此
  • 没有影响力
  • “Content-Type”字段中的HTTP“charset”参数。在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">
    
  • 将“http-equiv”属性设置为“Content-Type”并为“charset”设置值的META声明。 - 为什么不呢?!在HTML 5中将是:

    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    
  • 未指定的启发式分析。 - 您对此没有任何影响。

这些是要点。我的建议如下:

  • 检查您的网络服务器在提供HTML时是否发送了正确的标题。
  • 拥有您的HTML以及这些元标记,以便可以将HTML文件保存在磁盘上,稍后在浏览器中打开(离线,存档)。
  • 如果您使用的是UTF-8,请不要将BOM放在文档中。
  • 如果使用Unicode,请勿使用UTF-16或UTF-32,请使用UTF-8。

如果您的目标是完全不知道编码的系统,请使用US-ASCII并将其他所有不作为HTML实体的部分掩盖。

  

注意:此权限建议用于输出到浏览器而不是用于存储,存储属于您所在区域,确保您在处理商店时了解编码。不要使用HTML实体,例如当你不真正需要它时将HTML写入你的mysql数据库(例如HTML链接中的&amp;)。