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

news/2024/7/21 6:36:53 标签: ie, 浏览器, html, firefox, header, byte
html" title=ie>iews" class="htmledit_vhtml" title=ie>iews">

当在html" title=ie>iehtml" title=浏览器>浏览器下面浏览网页面的时候使用 utf-8 编码,<title>标签被放在<meta>标签前面。当title为中文的时(比如Blog名为中文或者文章标题为中文),在IE下会出现显示空白页的问题。而使用gbk或者gb2312等编码就不会有什么问题了。

由于 utf-8 使用3个字节表示一个汉字,而GB2312或BIG5使用两个字节。页面输出时,由于上述原因,使html" title=浏览器>浏览器解析、输出<title> </title>的内容时,如果在</title>前有奇数个全角字符时,IE把 UTF-8 当作两个字节解析时出现半个汉字的情况,这时该半个汉字会和</title>的<结合成一个乱码字,导致IE无法读完< title>部分,致使整个页面为空百输出。此时查看源文件,会发现实际上整个页面全部已经下载了。

html" title=浏览器>浏览器解析html的方式是:html" title=浏览器>浏览器读取了页面的html代码后开始进行解析。解析前html" title=浏览器>浏览器要先知道页面的编码方式,然后根据编码方式进行解码,然后才能开始解析。

html" title=浏览器>浏览器可以从下面3个方面得到页面编码方式:

HTTP Header中的”Content-Type”项;

返回的html代码开头是否有BOM(Byte order Mark);

html代码中的meta标签。

html" title=浏览器>浏览器(无论是IE还是Firefox)在解析页面时,首先取HTTP Header中的Content-Type项,如果有写明charset的话就认定页面的编码方式为charset指定的值。如果没有指明,则认定为默认 值。根据上表,IE中文版的默认值是GB2312,Firefox中文版的默认值是GBK,不过IE的GB2312好像和GBK没啥区别。然后,html" title=浏览器>浏览器会 看一下有没有BOM。一旦发现有UTF-8的3字节BOM,则重新认定页面的编码方式为UTF-8。

解码阶段,解码完成后是解析html的阶段。解析html的过程中,当解析到head部分的meta标签时,html" title=浏览器>浏览器会根据<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解析的步骤才能生效,而生效后,html" title=浏览器>浏览器会退 回几步,重新设置好HTTP头从头再开始解码、解析html。所以meta中写的内容会覆盖HTTP头里的内容,无论哪个html" title=浏览器>浏览器都是这样的。

出现空白页必须的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就更不会了。


http://www.niftyadmin.cn/n/1737820.html

相关文章

Theos-tweak工程

1、查看《iOS逆向 开发工具》 Theos的使用方法做准备工作&#xff1b; 2、创建tweak工程&#xff0c;实现在屏幕上添加弹框&#xff08;越狱手机&#xff09;&#xff1b; 3、Logos语法。 完成该工程&#xff0c;我们可以实现在任意地方添加我们想要的功能。任性&#xff0c;吼…

使用开源软件必须注意GPL,LGPL和BSD等协议

简而言之&#xff0c;GPL协议就是一个开放源代码协议&#xff0c;软件的初始开发者使用了GPL协议并公开软件的源程序后&#xff0c;后续使用该软件源程序开发软件者亦应当根据GPL协议把自己编写的源程序进行公开。GPL协议要求的关键在于开放源程序&#xff0c;但并不排斥软件作…

Swift闭包

闭包(Closures)是自包含的功能代码块&#xff0c;可以在代码中使用或者用来作为参数传值。类似于OC中的block&#xff0c;js中的匿名函数以及其他一些编程语言中的匿名函数。 1、全局函数&#xff1a;有名字但不能捕获任何值&#xff1b; 2、嵌套函数&#xff1a;有名字&#x…

总结下CGI常用的环境变量

每当服务器加载脚本的一个实例时下述环境变量被设置&#xff0c;并且是私有和特定于该实例的&#xff1a;AUTH_TYPE如果服务器支持基本的认证并且如果脚本被保护&#xff0c;此变量提供认证类型&#xff0c;此信息是特定于协议和服务器的。AUTH_TYPE的一个例子是BASIC。CONTENT…

Swift UI控件

swift是对OC语法的简化&#xff0c;使用函数式编码方式&#xff0c;编码更简洁灵活。使用let来声明常量&#xff0c;var来声明变量。一些类方法的调用可以直接使用点来获取类方法&#xff0c;省去类名&#xff0c;编译器会自动识别对应的类。下面是对一些控件的初始化及展示的写…

Flutter_iOS混合开发

iOS项目最终是要打包上线&#xff0c;上线后的代码我们动都不敢动&#xff0c;可能是动不了吧&#xff0c;尴尬……。然而Flutter应用也是不可以的&#x1f602;&#xff0c;带有Flutter工程的iOS项目&#xff0c;模拟器测试的时候才可以对Flutter业务做热更新&#xff08;其实…

函数响应式编程思想 RxSwift 核心逻辑

函数响应式编程 函数式编程 响应式编程 一、函数式 一种编程范式&#xff0c;如yf(x)&#xff0c;yf(f(x))&#xff08;高阶函数&#xff09;&#xff0c;不同的输入对应不同结果&#xff0c;f(x)对应具体的数据处理流程&#xff0c;可以是简单的常量值&#xff0c;也可以是…

IE6上Gzip+Etag问题的解决方案

http://www.blogjava.net/emu/archive/2011/02/27/345262.html 这个问题不是太广为人知&#xff0c;但也算不上新鲜知识了&#xff0c;IE6如果接收到一个gzip压缩的http响应&#xff0c;那么这个响应中的Etag信息会被抛弃&#xff0c;此时只能依赖last-modified时间来设计cache…