概况:
在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节,字符编码。
其他资源
有关浏览器对于存在/不存在的内容类型和字符集规范的行为的详细信息,请参阅:
后记:
在页面中指定字符集、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》所说,我们最好在HTTP响应头中指定字符集和X-UA-Compatible(如果需要的话),结论如下:
For best performance, specify your page’s character set and X-UA-Compatible (if desired) using HTTP response headers, helping the browser avoid expensive restarts.