首页 > 代码库 > [翻译]指定页面使用的字符集

[翻译]指定页面使用的字符集

 

概况:

      在HTML文档的响应头中指定一个字符集可以让浏览器立即开始解析HTML和执行脚本。

细节:

      HTML文档在网络中是以伴随字符编码信息的字节序列形式传送的。字符编码信息可以指定在文档的HTTP请求头中,也可以在HTML里面的标记里面(meta标签)。浏览器使用编码信息将字节流转化成可渲染到屏幕上的字符。如果浏览器无法知道构建页面的字符,那么浏览器是无法正确渲染页面的。因此,浏览器在输入中查找字符编码信息时,会在执行任何脚本和绘制页面之前缓冲一定大小的字节。(导致在IE6、7、8中出现明显异常)

      如果没有找到字符集,浏览器对于默认的编码方式和缓冲字节的大小是不一样的。然而,一旦浏览器缓冲完必须的字节数并开始渲染页面时,渲染页面中如果发现页面中的字符集和默认的不一致,浏览器就需要重新解析输入和重新绘制页面。有时候,如果字符集和默认字符的不一致影响了外部资源的url(注:如果url中包含把中文等非英文字符,不同的编码方式可能会导致url的不一致),浏览器还需要重新请求资源。

      为了避免这些延迟,你需要在http响应头中指定你使用的字符集。注意:如果通过meta标签http-equiv来指定字符集,IE8的先行下载(lookahead downloader)功能将被禁用。禁用IE8的先行下载功能回导致加载页面的时间大大增加。微软是这样写的:我们强烈建议Web开发人员在HTTP的Content-Type响应头中指定字符集,因为这样可以确保先行下载的性能优势得以实现。

建议

始终指定内容类型(content-type)

      在浏览器开始检查字符集之前,必须确定正在处理的文档的的内容类型。如果内容类型没有在http头或者http的meta标签中指定,浏览器就会根据不同的算法来判断类型。这个过程可能会导致额外的延迟以及一个安全漏洞。处于性能和安全性的考虑,我们应该为所有资源指定一个内容类型(不仅是text/html,也就是html文档)。

一定要指定正确的字符编码

      不论是在http头还是在文档meta标签中指定字符集,字符集应该和文档中真正的字符编码相匹配。如果http响应头和meta标签中都指定了字符集,我们必须保证二者相互匹配。如果浏览器检测到一个不正确的或不匹配的编码方式,它会错误地渲染页面和/或产生额外的延迟,同时还会重绘页面。有关有效字符集的详细信息,请参见HTML 4.01规范中的第5.2节,字符编码

其他资源

      有关浏览器对于存在/不存在的内容类型和字符集规范的行为的详细信息,请参阅:

  • Page Speed??的wiki
  • 浏览器性能问题集
  • “字符集”的性能影响

 

 

后记:

在页面中指定字符集、x-ua-compatible、<base>,这三者是具有一定的顺序的。对于字符集,应该尽量在head的最前面,后面紧跟x-ua-compatible,然后是base:

<doctype> 
<html> 
<head> 
<meta http-equiv content-type charset>  
            <meta http-equiv x-ua-compatible> 
            <base> 
<title, favicon, comments, script blocks, etc>

 

参考文章:

Best Practice: Get your HEAD in order

谈谈关于IE8的一些bug,主要是base href