posts - 431,  comments - 344,  trackbacks - 0
当页面使用 utf-8 编码时,
  <title>标签被放在<meta>标签前面。当title为中文的时(比如Blog名为中文或者文章标题为中文),在IE下会出现显示空白页的问题。
  
  由于 utf-8 使用3个字节表示一个汉字,而GB2312或BIG5使用两个字节。页面输出时,由于上述原因,使浏览器解析、输出<title> </title>的内容时,如果在</title>前有奇数个全角字符时,IE把 UTF-8 当作两个字节解析时出现半个汉字的情况,这时该半个汉字会和</title>的<结合成一个乱码字,导致IE无法读完<title>部分,致使整个页面为空百输出。此时查看源文件,会发现实际上整个页面全部已经下载了。
  
  而浏览器解析html的方式是:浏览器读取了页面的html代码后开始进行解析。解析前浏览器要先知道页面的编码方式,然后根据编码方式进行解码,然后才能开始解析。
  浏览器可以从下面3个方面得到页面编码方式:
  HTTP Header中的"Content-Type"项;
  返回的html代码开头是否有BOM(Byte Order Mark);
  html代码中的meta标签。
  
  浏览器(无论是IE还是Firefox)在解析页面时,首先取HTTP Header中的Content-Type项,如果有写明charset的话就认定页面的编码方式为charset指定的值。如果没有指明,则认定为默认值。根据上表,IE中文版的默认值是GB2312,Firefox中文版的默认值是GBK,不过IE的GB2312好像和GBK没啥区别。然后,浏览器会看一下有没有BOM。一旦发现有UTF-8的3字节BOM,则重新认定页面的编码方式为UTF-8。
  
  解码阶段,解码完成后是解析html的阶段。解析html的过程中,当解析到head部分的meta标签时,浏览器会根据<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />这个语句中的说明,重新认定编码方式为charset后面的方式,中断html解析过程,返回到解码步骤重新解码。
  
  GBK 和 UTF-8 的编码范围:
  GBK的编码范围是0×8140-0xfefe。从GB2312-80开始,因为ASCII码的范围是0~127,首字位是0,所以GB2312-80使用双字节,并设置首字位为1。“GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间。”
  
  UTF-8中中文都是3个字节的,由于Unicode中中日韩的文字都混在一起,可以使用Windows自带的字符映射表查看CJK表意字符的范围,即为汉字的范围。3字节的UTF-8编码是:1110xxxx 10xxxxxx 10xxxxxx,编码范围是8000-EFFF,首字节在80-EF之间,尾字节在00-FF之间。
  
   显然当一段UTF-8编码的文本被按照GBK方式解码的时候,由于有一些编码在GBK中不存在,造成解码程序出现错误。当UTF-8文本被按照GBK的方式解码的时候,前两个字节会被认为是一个字,后一个字节将和下一个字符结合。当<title>标签里的汉字数是偶数个时,勉强有3/4的概率通过解码程序(因为GBK的第二个字节要求是40-FE),当有奇数个汉字的时候,最后一个汉字的三个字节的最后一个字节会和< /title>的第一个字符<结合,而<的编码是3C,正好不在尾字节40-FE的范围中,造成错误。如果< /title>标签前有多余的空格也会产生错误,因为空格的编码20也不在范围中。
  
  meta 标签的作用:详细请看 《HTML中meta的作用》
  “meta是用来在HTML文档中模拟HTTP协议的响应头报文。”在meta标签中写和在HTTP头里写是一样的,这也是为了解决用普通HTML写网页的人无法自行定义HTTP头的问题。但是,meta是一个html标签,所以必须进入到html解析的步骤才能生效,而生效后,浏览器会退回几步,重新设置好HTTP头从头再开始解码、解析html。所以meta中写的内容会覆盖HTTP头里的内容,无论哪个浏览器都是这样的。
  
  出现空白页必须的3项条件:
  1.title标签里的内容为中文其他双字节字符;
  2.指定网页编码的 meta 信息在 title 标签的下方;
  3.另存或转换utf-8编码时没有包括 unicode 签名。
  
  BOM (Byte Order Mark,字节序标识)的作用:
  用于UTF-16编码的文件,在UTF-8编码的文件中不需要标识字节序,所以被用来标识这是一个UTF-8编码文件。
  
  这个问题还是IE的兼容性问题,在解码的时候如果遇到错误的编码就中断解码。
  这个是IE的bug,不过也不要认为你用的是MyIE、MyIE2、遨游Maxthon、GreenBrowser、腾讯TT就不会受到影响。Firefox或者Opera就更不会了。
  
  解决办法:
  utf8页面应该使用标准顺序
  <meta http-equiv=”content-type” content=”text/html; charset=UTF-8″ />
  <meta http-equiv=”content-language” content=”zh-CN” />
  <meta name=”robots” content=”index,follow” />
  <meta name=”keywords” content=”" />
  <meta name=”description” content=”" />
  <meta name=”rating” content=”general” />
  <meta name=”author” content=”" />
  <meta name=”copyright” content=”" />
  <meta name=”generator” content=”" />
  <title></title>
  
  参考文章:
  http://hewei.org/website-research/shtml-utf8-bom/ shtml调用在utf8编码下多出空行的问题(解决)
  IE中打开UTF-8编码title为中文的网页会显示空白页的问题 (文中大部分是这里的观点)
    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
posted on 2008-02-29 17:31 周锐 阅读(1052) 评论(0)  编辑  收藏 所属分类: HTMLJsp

只有注册用户登录后才能发表评论。


网站导航: