Web瀏覽器是否能正確顯示一個(gè)Web頁(yè)通常依賴兩個(gè)條件:
一、頁(yè)面的編碼(文件編碼).
二、該頁(yè)定義的contentType.
其中頁(yè)面的編碼是決定性的因素。兩者一致是,瀏覽器會(huì)正常顯示內(nèi)容,否則有可能產(chǎn)生亂碼現(xiàn)像。
如果一個(gè)Html文件,文件編碼為UTF-8。contentType設(shè)為相同。則使用IE或Firefox查看,兩者都會(huì)自動(dòng)選擇正確的編碼形式來(lái)解釋。當(dāng)我將contentType設(shè)為GB2312,以為會(huì)造成亂碼,結(jié)果不會(huì)。我認(rèn)為原因是這樣的:文件編碼起決定作用,加上Utf-8包括了GB該有的字符,所以這種情況是以大的來(lái)認(rèn)識(shí)小的。沒(méi)問(wèn)題。(不知是否有理解錯(cuò)誤 :P)。
上述情況為使用瀏覽器直接把開(kāi)網(wǎng)頁(yè)文件的結(jié)果。當(dāng)我使用Webwork的Action時(shí),將Html文件作為結(jié)果時(shí)(結(jié)果類型為dispatcher),亂碼出現(xiàn)了!文件編碼為UTF-8,頁(yè)面定義的ContentType為UTF-8。但是偏偏使用IE及FireFox均得到亂碼的結(jié)果。郁悶中用Firefox查看了頁(yè)面的屬性,驚奇地發(fā)現(xiàn)頁(yè)面編碼居然是GB2312。我猜想是Webwork在Dispatch頁(yè)面的時(shí)候使用了默認(rèn)的編碼,把本來(lái)UTF-8編碼的頁(yè)面重新用GB2312編碼一次。于是試著在Action里面獲得Response并把字符編碼改為UTF-8。最后發(fā)現(xiàn)結(jié)果依然一樣。這時(shí),我覺(jué)得在Action完成后,Webwork接下來(lái)使用了Response,我的設(shè)置被重置了。于是決定自已寫(xiě)一個(gè)Servlet,指定字符編碼為UTF-8,結(jié)果直接Forward到我的Html頁(yè)面。結(jié)果正確了!再查看頁(yè)面信息,兩者都是UTF-8了。
平時(shí)使用Webwork來(lái)Dispatch的都是Jsp,不曾出現(xiàn)過(guò)這樣的情況。原因是Jsp仍需要編譯,編譯時(shí)會(huì)讀取Jsp頁(yè)面指定的ContentType來(lái)決定Response里的字符編碼。HTML文件則不一樣。這時(shí)只能使用默認(rèn)編碼。如果我的工程是Gb2312,那根本就不存在剛才所講的問(wèn)題的。