posts - 431,  comments - 344,  trackbacks - 0
          當(dāng)頁(yè)面使用 utf-8 編碼時(shí),
            <title>標(biāo)簽被放在<meta>標(biāo)簽前面。當(dāng)title為中文的時(shí)(比如Blog名為中文或者文章標(biāo)題為中文),在IE下會(huì)出現(xiàn)顯示空白頁(yè)的問(wèn)題。
            
            由于 utf-8 使用3個(gè)字節(jié)表示一個(gè)漢字,而GB2312或BIG5使用兩個(gè)字節(jié)。頁(yè)面輸出時(shí),由于上述原因,使瀏覽器解析、輸出<title> </title>的內(nèi)容時(shí),如果在</title>前有奇數(shù)個(gè)全角字符時(shí),IE把 UTF-8 當(dāng)作兩個(gè)字節(jié)解析時(shí)出現(xiàn)半個(gè)漢字的情況,這時(shí)該半個(gè)漢字會(huì)和</title>的<結(jié)合成一個(gè)亂碼字,導(dǎo)致IE無(wú)法讀完<title>部分,致使整個(gè)頁(yè)面為空百輸出。此時(shí)查看源文件,會(huì)發(fā)現(xiàn)實(shí)際上整個(gè)頁(yè)面全部已經(jīng)下載了。
            
            而瀏覽器解析html的方式是:瀏覽器讀取了頁(yè)面的html代碼后開(kāi)始進(jìn)行解析。解析前瀏覽器要先知道頁(yè)面的編碼方式,然后根據(jù)編碼方式進(jìn)行解碼,然后才能開(kāi)始解析。
            瀏覽器可以從下面3個(gè)方面得到頁(yè)面編碼方式:
            HTTP Header中的"Content-Type"項(xiàng);
            返回的html代碼開(kāi)頭是否有BOM(Byte Order Mark);
            html代碼中的meta標(biāo)簽。
            
            瀏覽器(無(wú)論是IE還是Firefox)在解析頁(yè)面時(shí),首先取HTTP Header中的Content-Type項(xiàng),如果有寫明charset的話就認(rèn)定頁(yè)面的編碼方式為charset指定的值。如果沒(méi)有指明,則認(rèn)定為默認(rèn)值。根據(jù)上表,IE中文版的默認(rèn)值是GB2312,F(xiàn)irefox中文版的默認(rèn)值是GBK,不過(guò)IE的GB2312好像和GBK沒(méi)啥區(qū)別。然后,瀏覽器會(huì)看一下有沒(méi)有BOM。一旦發(fā)現(xiàn)有UTF-8的3字節(jié)BOM,則重新認(rèn)定頁(yè)面的編碼方式為UTF-8。
            
            解碼階段,解碼完成后是解析html的階段。解析html的過(guò)程中,當(dāng)解析到head部分的meta標(biāo)簽時(shí),瀏覽器會(huì)根據(jù)<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />這個(gè)語(yǔ)句中的說(shuō)明,重新認(rèn)定編碼方式為charset后面的方式,中斷html解析過(guò)程,返回到解碼步驟重新解碼。
            
            GBK 和 UTF-8 的編碼范圍:
            GBK的編碼范圍是0×8140-0xfefe。從GB2312-80開(kāi)始,因?yàn)锳SCII碼的范圍是0~127,首字位是0,所以GB2312-80使用雙字節(jié),并設(shè)置首字位為1。“GBK 亦采用雙字節(jié)表示,總體編碼范圍為 8140-FEFE,首字節(jié)在 81-FE 之間,尾字節(jié)在 40-FE 之間。”
            
            UTF-8中中文都是3個(gè)字節(jié)的,由于Unicode中中日韓的文字都混在一起,可以使用Windows自帶的字符映射表查看CJK表意字符的范圍,即為漢字的范圍。3字節(jié)的UTF-8編碼是:1110xxxx 10xxxxxx 10xxxxxx,編碼范圍是8000-EFFF,首字節(jié)在80-EF之間,尾字節(jié)在00-FF之間。
            
             顯然當(dāng)一段UTF-8編碼的文本被按照GBK方式解碼的時(shí)候,由于有一些編碼在GBK中不存在,造成解碼程序出現(xiàn)錯(cuò)誤。當(dāng)UTF-8文本被按照GBK的方式解碼的時(shí)候,前兩個(gè)字節(jié)會(huì)被認(rèn)為是一個(gè)字,后一個(gè)字節(jié)將和下一個(gè)字符結(jié)合。當(dāng)<title>標(biāo)簽里的漢字?jǐn)?shù)是偶數(shù)個(gè)時(shí),勉強(qiáng)有3/4的概率通過(guò)解碼程序(因?yàn)镚BK的第二個(gè)字節(jié)要求是40-FE),當(dāng)有奇數(shù)個(gè)漢字的時(shí)候,最后一個(gè)漢字的三個(gè)字節(jié)的最后一個(gè)字節(jié)會(huì)和< /title>的第一個(gè)字符<結(jié)合,而<的編碼是3C,正好不在尾字節(jié)40-FE的范圍中,造成錯(cuò)誤。如果< /title>標(biāo)簽前有多余的空格也會(huì)產(chǎn)生錯(cuò)誤,因?yàn)榭崭竦木幋a20也不在范圍中。
            
            meta 標(biāo)簽的作用:詳細(xì)請(qǐng)看 《HTML中meta的作用》
            “meta是用來(lái)在HTML文檔中模擬HTTP協(xié)議的響應(yīng)頭報(bào)文。”在meta標(biāo)簽中寫和在HTTP頭里寫是一樣的,這也是為了解決用普通HTML寫網(wǎng)頁(yè)的人無(wú)法自行定義HTTP頭的問(wèn)題。但是,meta是一個(gè)html標(biāo)簽,所以必須進(jìn)入到html解析的步驟才能生效,而生效后,瀏覽器會(huì)退回幾步,重新設(shè)置好HTTP頭從頭再開(kāi)始解碼、解析html。所以meta中寫的內(nèi)容會(huì)覆蓋HTTP頭里的內(nèi)容,無(wú)論哪個(gè)瀏覽器都是這樣的。
            
            出現(xiàn)空白頁(yè)必須的3項(xiàng)條件:
            1.title標(biāo)簽里的內(nèi)容為中文其他雙字節(jié)字符;
            2.指定網(wǎng)頁(yè)編碼的 meta 信息在 title 標(biāo)簽的下方;
            3.另存或轉(zhuǎn)換utf-8編碼時(shí)沒(méi)有包括 unicode 簽名。
            
            BOM (Byte Order Mark,字節(jié)序標(biāo)識(shí))的作用:
            用于UTF-16編碼的文件,在UTF-8編碼的文件中不需要標(biāo)識(shí)字節(jié)序,所以被用來(lái)標(biāo)識(shí)這是一個(gè)UTF-8編碼文件。
            
            這個(gè)問(wèn)題還是IE的兼容性問(wèn)題,在解碼的時(shí)候如果遇到錯(cuò)誤的編碼就中斷解碼。
            這個(gè)是IE的bug,不過(guò)也不要認(rèn)為你用的是MyIE、MyIE2、遨游Maxthon、GreenBrowser、騰訊TT就不會(huì)受到影響。Firefox或者Opera就更不會(huì)了。
            
            解決辦法:
            utf8頁(yè)面應(yīng)該使用標(biāo)準(zhǔn)順序
            <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調(diào)用在utf8編碼下多出空行的問(wèn)題(解決)
            IE中打開(kāi)UTF-8編碼title為中文的網(wǎng)頁(yè)會(huì)顯示空白頁(yè)的問(wèn)題 (文中大部分是這里的觀點(diǎn))
              做人要厚道,請(qǐng)注明轉(zhuǎn)自酷網(wǎng)動(dòng)力(www.ASPCOOL.COM)。
          posted on 2008-02-29 17:31 周銳 閱讀(1074) 評(píng)論(0)  編輯  收藏 所屬分類: HTMLJsp
          主站蜘蛛池模板: 华宁县| 剑阁县| 南江县| 郑州市| 云霄县| 清涧县| 济阳县| 宕昌县| 台北市| 翼城县| 白山市| 陈巴尔虎旗| 阳曲县| 曲沃县| 廊坊市| 张家川| 梁河县| 青岛市| 阿鲁科尔沁旗| 五常市| 合肥市| 西宁市| 绥宁县| 北辰区| 怀化市| 宁安市| 理塘县| 漾濞| 郴州市| 德令哈市| 二连浩特市| 自治县| 奈曼旗| 弥勒县| 南开区| 津南区| 耿马| 福海县| 和林格尔县| 莆田市| 嘉黎县|