邮差 发表于 2011-8-13 13:02:17

IE对编码处理的bug

1,IE在处理一些网页上include的文件的时候,会按照网页的解码方式去解析这个被include的文件,而不关心这个文件本身的编码方式,比如一个GB2312编码方式的文件引用了一个UTF-8编码的js文件,IE可能会用GB2312去解析这个js文件,而不关心这个js文件的httpresponse header中已经告诉IE的charset(实际上为utf-8)。2, 如果IE在http responseheader中不能获得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><metahttp-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写在网页的最前面,在出现多字节字符之前。
页: [1]
查看完整版本: IE对编码处理的bug

请大家牢记南瓜园网址 www.nan2008.com