IE6讀取不到樣式檔案bug

lilac(雪青)發表於2014-06-23

早年的東東,貼出來充一下數吧~


 

問題描述

在一個彈層優化需求中,完成了修改後,刷一下其他(除IE6外)瀏覽器,很給力,展現都一個樣:

 

再刷下IE6,傻眼了:

 

初步分析

IE6問題多我知道,不過像這樣的問題還是第一次見,它不是某一處的展現問題,而是整個彈層內容……等等,整塊內容有問題,某個樣式沒有載入到?抱著這樣的猜測,google了一下,看到下面這句話:

 

此頁面引用的樣式檔案有三個,一個全域性樣式(global_min.css),一個彈層樣式(css_box_new.css),一個彈層內容樣式(css_app.css,以下簡稱內容樣式)。從頁面的展現來看,沒有引用到的應該是內容樣式。檢查了一下,果然,頁面中設定的charset=utf-8,頁面檔案也是utf-8編碼的,而內容樣式是ANSI編碼的:

 

 

 

解決方法

此頁面是xx站點下的,xx下檔案統一用gb2312編碼,故將頁面的charset值改為gb2312,並將頁面檔案轉為ANSI編碼:

 

修改後再刷下IE6,OK,木有問題了。

進一步探討

問題雖然解決了,但邏輯上還是說不通:

如果全域性和彈層樣式與內容樣式一樣是ANSI編碼,為什麼一開始它們可以被讀取呢?

如果全域性和彈層樣式不是ANSI編碼,那麼頁面編碼修改為ANSI編碼後,它們和頁面的就不一致了,為什麼沒有問題呢?

認真思考了三秒鐘,無果,去請教了下bboy90,沿著他給出的思路做了下測試:

說明:

樣式charset的設定有兩種方式,以gb2312為例:

方式一:在css檔案的開頭設定:

 

方式二:在<link>中設定:

表格中的“gb2312(樣)”指以方式一設定charset為gb2312,“gb2312(link)”指以方式二設定charset為gb2312。

從測試結果可以看出:

  • 頁面charset、頁面編碼、樣式charset、樣式編碼全部一致時正常(資料行2、4)——這條結論有點廢話,不過還是覺著要驗證下;
  • 樣式charset沒有設定時,預設與頁面charset一致(資料行1與2、3與4的比較);
  • 樣式charset可以與頁面charset不一致,但一定要與樣式編碼一致(資料行5、8、7、10)——這說明網上搜到的那句話並不正確,雖然它歪打正著地把問題解決了;
  • 以方式一設定樣式charset時有效,以方式二設定時無效(資料行5與6、8與9的比較)。

OK,現在我們對編碼的一致性原則有了一定的瞭解,再回過頭來分析上面的問題:

經查實,全域性和彈層樣式都是引用主站的,均為utf-8編碼,並且樣式檔案中沒有設定charset,即修改前:

修改後:

為什麼內容樣式的charset與編碼不一致時,會出現問題,而全域性和彈層樣式的charset與編碼不一致時就正常呢?文品問題嗎?

根據bboy90的說法,當樣式charset與編碼不一致時,若註釋符號/* */與中文內容間沒有空格(如下),則容易出現問題。

 

檢查了一下,果然,全域性和彈層樣式的註釋符號/* */與註釋內容間均有空格,而內容樣式的註釋符號/* */與註釋內容間多處沒有空格。

為了進一步驗證,針對內容樣式的幾條註釋進行了測試:

以上測試並不能得出什麼像樣的結論,革命尚未成功,同志仍需努力:

大家平時可能也有遇到過,當樣式的編碼為ANSI時(注意,這裡說的是編碼為ANSI時,並非樣式charset與編碼不一致時),編輯註釋間的中文時,有時會出現亂碼,如:

 

當我刪除“點”時,會變成這樣:

 

繼續往左刪兩次,更奇葩:

 

……

結合這個和前面的測試,我做了一個大膽的猜想:

當樣式charset與編碼不一致時,樣式檔案中中文的解析會出現問題,而中文解析的錯誤會影響到緊跟在後面的*/,導致*/的解析也出錯,*/不被識別到,結果下面的樣式就以被註釋掉處理了。而新增空格等於在中文和*/間新增一緩衝地帶,中文解析錯誤時影響緊跟其後的空格,空格後面的*/就可以倖免於難了。因中文是兩個位元組的,新增兩個空格應該足以緩衝了。

因多數瀏覽器的容錯機制比較好,所以沒有問題,而IE6這個可憐娃兒先天不足、後天畸形,面對這種問題就束手無策了。

但是……

這樣的猜測還有點說不通,編輯時亂碼是發生在樣式編碼為ANSI時,與樣式charset和編碼的一致性無關;而展現異常發生在樣式charset和編碼不一致性時,與編碼是否為ANSI無關。

哦……忙活了半天,還是無果(淚奔)

結論

  • 請為樣式檔案設定charset,並保持與編碼一致——考慮到未來的趨勢,建議charset和編碼均設為utf-8。
  • 為了更好地容錯,建議註釋符號/* */與註釋內容間均空兩個空格。

2012.12.3

相關文章