fiag
管理员
管理员
  • UID1188
  • 注册日期2004-12-21
  • 最后登录2024-04-22
  • 发帖数4681
  • 经验686枚
  • 威望0点
  • 贡献值402点
  • 好评度51点
阅读:2742回复:0

[转载]最近发现的IE编码上的2个Bug

楼主#
更多 发布于:2006-02-23 11:57
IE编码上的2个Bug

1, IE在处理一些网页上include的文件的时候,会按照网页的解码方式去解析这个被include的文件,而不关心这个文件本身的编码方式,比如一个 GB2312编码方式的文件引用了一个UTF-8编码的js文件,IE可能会用GB2312去解析这个js文件,而不关心这个js文件的http response header中已经告诉IE的charset(实际上为utf-8)。
 
2, 如果IE在http response header中不能获得encoding,那么IE有的时候会按照某种编码(或者是上次的编码)来处理html,直到找到页面中的设置的charset为止,带来的问题IE不能很好的处理一些多字节的编码,比如如下html代码
<html> <head><title>新年好</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>新年好</body></html>

如果在ie中改变解码方式为GB2312,网页上什么都没有出现,再刷新,还是没有,发现解码方式还是为GB2312,而不是html中指定的UTF-8。但是下面这个代码就没有问题
<html> <head><title>新年好啊</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>新年好</body></html>

这个页面在制定GB2312编码之后不能显示,但是只要刷新就可以正确显示,IE会在meta中找到正确的charset
 
 
这个问题的原因是因为IE对多字节编码的解析的一个BUG,IE总是很固执的按照第1个字节的特征来看是不是一个多字节字,在页面刷新之后IE 会按照上次的编码方式先去读内容,因为在UTF-8下“新年好”是9个字节,而GB2312下中文只有2个字节,IE会将“好”的最后一个字节和 "<"认为是一个汉字来处理,这样实际上<title>标签就一直没有结束,IE会将后面的"<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />"当作title中的内容,所以这个时候IE就认为找不到charset了,仍然按照GB2312处理网页,导致显示错误。而"新年好啊"是 12个字节,正好在GB2312下也是完整的字节数,这样IE就可以正确解析后面的charset,然后转换用charset中指定的UTF-8编码,这样显示就正确了。
 
避免这个问题的办法是尽量把meta中的charset写在网页的最前面,在出现多字节字符之前。
游客

返回顶部