接著上節的思路說,一個網頁要想在浏覽器中能夠正確顯示,需要在三個地方保持編碼的一致:網頁文件,網頁編碼聲明和浏覽器編碼設置。
首先是網頁文件本身的編碼,即網頁文件在被創建的時候使用什麼編碼來保存。這個完全取決於創建該網頁的人員使用了什麼編碼保存,而進一步的取決於該人員使用的操作系統。例如我們使用的中文版WindowsXP系統,當你新建一個文本文件,寫入一些內容,並按下ctrl+s進行保存的那一刻,操作系統就替你使用GBK編碼將文件進行了保存(沒有使用UTF-8,也沒有使用UTF-16)。而使用了英文系統的人,系統會使用ISO-8859-1進行保存,這也意味著,在英文系統的文件中如果輸入一個漢字,是無法進行保存的(當然,你甚至都無法輸入)。
一個在創建XML文件時(創建HTML的時候倒很少有人這麼做)常見的誤解是以為只要在頁面的encoding部分聲明了UTF-8,則文件就會被保存為UTF-8格式。這實在是……怎麼說呢,不能埋怨大家。實際上XML文件中encoding部分與HTML文件中的charset中一樣,只是告訴“別人”(這個別人可能是浏覽你的頁面的人,可能是浏覽器,也可能是處理你頁面的程序,別人需要知道這個,因為除非你告訴他們,否則誰也猜不出你用了什麼編碼,僅通過文件的內容判斷不出使用了什麼編碼,這是真的)這個文件使用了什麼編碼,唯獨操作系統不會搭理,它仍然會按自己默認的編碼方式保存文件(再一次的,在我們的中文WindowsXP系統中,使用GBK保存)。至於這個文件是不是真的是encoding或者charset所聲明的那種編碼保存的呢?答案是不一定!
例如新浪的頁面就“聲稱”他是用GB2312編碼保存的,但實際上卻是GBK,也有無數的二把刀程序員用系統默認的GBK保存了他們的XML文件,卻在他們的encoding中信誓旦旦的說是UTF-8的。
這就是我們所說的第二個位置,網頁編碼聲明中的編碼應該與網頁文件保存時使用的編碼一致。
而浏覽器的編碼設置實際上並不嚴格,就像我們第三節所說的那樣,在浏覽器中選擇使用GB2312來查看,它實際上仍然會使用GBK進行。而且浏覽器還有這樣一種好習慣,即它會盡量猜測使用什麼編碼查看最合適。
我要重申的是,網頁文件的編碼和網頁文件中聲明的編碼保持一致,這是一個極好的建議(值得遵循,會與人方便,與己方便),但如果不一致,只要網頁文件的編碼與浏覽器的編碼設置一致,也是可以正確顯示的。
例如有這樣一個頁面,它使用GBK保存,但聲明自己是UTF-8的。這個時候用浏覽器打開它,首先會看到亂碼,因為這個頁面“告訴”浏覽器用UTF-8顯示,浏覽器會很尊重這個提示,於是亂碼一片。但當手工把浏覽器設為GBK之後,顯示正常。
說了以上四節這麼多,後面我們就來侃侃Java裡的字符編碼,你會發現有意思且撓頭的事情很多,但一旦弄通,天下無敵(不過不要像東方不敗那樣才好)。