var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年10月01日

    浏览器解码

    分类:

    浏览器从3个渠道获取网页的编码方式:

    1.     HTTP HeaderResponse Headers中的“Content-Type(i.e. Content-Type:text/html; charset=UTF-8)

    2.     返回的html代码开头是否有BOM

    3.     前端html代码中的meta content”(i.e. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />)

     

    依据W3C字符集规定,任何浏览器解析online网页时,首先取Response Header中的Content-Type项,如果指明了charset就以此值读该页面;如果没指明,HTTP协议,3.7.1指定ISO-8859-1作为默认字符集编码,但在实际中,这个建议无法实行因为一些网页服务器不允许发送”charset”参数,还有些其它的服务器可能没被配置来发送该参数,这样无法在HTTP头内定义charset。因此,没指明charset时浏览器会根据当前操作系统的CodePage作为默认值来读,比如IEGB2312FireFoxGBK。然后浏览器会尝试读网页前几个字节看看有没有BOM,一旦发现有,则重新设定页面编码,从头再读入网页。

     

    如果该online网页在HTTP Header中没有charset,整个网页也不带有BOM,浏览器进入解析html页面阶段。解析过程中,当碰到head部分meta标签时,如果该标签中有了charset,则会重新设定页面编码方式为此值,并中断html解析,返回重新解码。但这时不同浏览器对meta的处理有所不同,假设title中的内容需要charset指定的值才能正确解析,那么IEmetatitle之后是无法正确解析出错,除非改变meta放在title之前;但Firefox就不会有这一问题,Firefox找着带charsetmeta后会从头开始按照该值重新解码。

     

    浏览器读online网页后,若要保存,则一定是以当前网页编码方式保存的;若用户想修改保存方式,则需要改变该页面编码,然后才能保存为用户想要的编码网页。浏览器对HTTP头没有charset的网页还能自动检测编码(IE是自动选择,FireFox是自动检测);我尝试了一个例子,结果发现Firefox的自动探测比IE要强。迄今公开的有名的猜测解码的方式为NetEase公司的论文A composite approach to language/encoding detection,有不少的开源库正是基于此文。

     

    【资源】

    IE中打开UTF-8编码title为中文的网页会显示空白页的问题

    分享到: