Java零基礎入門教程-JSP亂碼問題解決
我們先來看“pageEncoding”屬性。
當我們使用MyEclipse創(chuàng)建一個JSP后,由于MyEclipse使用模板創(chuàng)建JSP,所以新建的JSP中都會有page指令設置了這個屬性,例如:

MyEclipse中給我們創(chuàng)建的JSP默認使用“ISO-8859-1”碼表,當然我們可以在模板中改變成別的碼表,這里先記住這個默認的編碼表。
“pageEncoding”屬性是在JSP頁面的編碼,指定了在將該JSP頁面中的內容由JSP引擎(或Tomcat)將其翻譯轉換成.java文件(即Servlet)時所采用的編碼表。
在JSP標準語法中,如果”pageEncoding”屬性存在,那么JSP頁面的字符編碼方式就由pageEncoding指定;否則就由“contentType”屬性中的”charset”決定,如果”charset”也不存在,那么就默認采用“ISO-8859-1”編碼表。
如果我們不是用一個開發(fā)工具,例如MyEclipse來編寫JSP,而是采用如記事本或者EditPlus這樣的文本編輯器來寫JSP。那么我們存儲時總是要選擇何種編碼來將我們的文件內容存儲在計算機硬盤中。如果這時候我們選擇的編碼跟以后要進行解碼的碼表不對,中文基本都是要出現(xiàn)問題的,所以我們在存儲JSP頁面時,一定要按照”pageEncoding”屬性來選擇以何種碼表形式來存儲。
因此請務必保證你存儲JSP所使用的碼表和你JSP頁面中設置的”pageEncoding”屬性保持一致。
如果是用像MyEclipse這樣比較“聰明的開發(fā)工具”,在我們保存JSP時,它會自動自動根據我們所設置的“pageEncoding”屬性的編碼表進行保存:
例如我將某個web工程下的“index.jsp”中的“pageEncoding”屬性改為“utf-8”,接著右鍵點擊工作目錄下的“index.jsp”,選擇最下方的【Preference】:

????我們可以看到MyEclipse自動幫我們把該JSP保存為UTF-8編碼格式:

如果我們再將這個“index.jsp”中的“pageEncoding”屬性改為“GB2312”,保存后重新查看:

就是這么“智能”,但如果不知道這一點的人會比較納悶MyEclipse是以怎么樣的方式保存的。
現(xiàn)在我們再來看“contentType”這個page指令的屬性。
在Servlet的開始調用response.setContentType(“text/html;charset=UTF-8”)或者如果是字符流還必須先指明使用的字符表,調用response.setCharacterEncoding(“UTF-8”)來解決中文亂碼問題。
之前利用Servlet來做是因為我們的代碼直接都寫在Servlet中,而現(xiàn)在我們是編寫JSP代碼,我們對JSP更關心的獲取和怎么顯示數據,并且服務器總要將JSP翻譯轉換為Servlet,而這個Servlet在Tomcat的【work】目錄中,我們應該是不對其進行操作的,因此我們必須要將這個翻譯轉換后的Servlet能進行以前一些我們直接編寫Servlet的設置,比如說給瀏覽器反饋而指示瀏覽器應該采用何種編碼表來解析顯示數據。
這一點就是“contentType”這個屬性所做的工作,當我們設置了“contentType”,那么在JSP轉換成Servlet后,在這個Servlet中服務器自動幫我們添加response.setContentType方法或也有response.setCharacterEncoding方法。這時瀏覽器就能根據這個Servlet發(fā)回的響應對象選擇合適的編碼表進行數據解析并顯示。
其實只要我們設置了“pageEncoding”屬性,我們就默認地也設置了“contentType”的編碼表。但記住保存JSP時還是要注意采用的編碼表,不要因為MyEclipse能自動根據我們設置的“pageEncoding”而選擇編碼表保存而我們使用別的方式保存JSP就忘了怎么回事。
比如我們將某個web工程中的“pageEncoding”屬性改為“GB2312”,那么在JSP轉換成的Servlet中,會自動將response.setContentType(…)方法中的編碼表改變:
? ? response.setContentType("text/html;charset=GB2312");
如果我們的JSP頁面中沒有“pageEncoding”屬性,那么你會發(fā)現(xiàn)對應的Servlet中setContentType的代碼是這樣寫的:
? ? response.setContentType("text/html");
即不設置任何編碼表,因此服務器將JSP轉換為Servlet所采用的編碼表和服務器通知瀏覽器所采用的編碼表都將采用“ISO-8859-1”。