當瀏覽器向服務器請求的網頁中包含有中文時,要想不出現亂碼,很簡單,只需要設置response的contentType屬性即可。
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print("我在測試瀏覽器亂碼問題");
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
其中charset的值設置成“GBK”,“GB2312”和“UTF-8”都是可以的,最好還是設置成“UTF-8”,這個是國際編碼,前面兩個是國標碼,只適用於國內。response.setContentType的作用有兩個:1、告訴服務器應該以何種編碼方式對網頁進行編碼傳輸;2、在響應消息頭中插入Content-Type:text/html;charset=utf-8 信息,瀏覽器通過這條信息,知道應該以何種方式來解碼服務器發送過來的數據。從而保證中文正常顯示。有人說,使用response.setCharEncoding()也能解決亂碼問題,對此我只能說,如果你是通過這樣解決亂碼問題的,那隻能說明你的運氣還不錯,因爲response.setCharEncoding(),只能告訴服務器應該以何種編碼方式來編碼要傳輸的文件,卻不能像response.setContentType()那樣告訴瀏覽器以何種方式來解碼所接收到的文件。不信你將瀏覽器的編碼方式修改下再刷新,你的頁面顯示就是亂的。不過現在的瀏覽器越來越智能,可以根據服務器發送過來的數據自動選擇合適的解碼方式解碼,在勾選這個“自動選擇”選項的情況下,你也可以使用response.setCharEncoding()來解決亂碼問題。選擇前面一種解決方式應該是嚴謹的程序員的選擇,呵呵。
當通過表單向服務器提交一段中文時,在後臺要想正常獲取中文內容,相比起上面要稍微複雜一些。向服務器提交中文內容,它到達服務器要經過兩個階段:1、在瀏覽器端編碼發送;2、在服務器端解碼接收。在瀏覽器端以何種方式編碼呢,這就是我上面支持的採用response.setContentType來解決亂碼問題的原因了,它所採用的編碼方式就是charset的屬性值。在服務器端以何種方式解碼呢,這個要按照提交方式不同而分別討論了。向服務器提交內容的方式最常用的是GET和POST。GET將表單的信息放在URL中,因此以GET方式提交的內容會被當做URL的一部分解碼,這個設置在tomcat的配置文件server.xml中,如圖所示:
<Connector
<span style="color:#ff0000;"> URIEncoding="utf-8"</span> port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
compression="on" compreesionMinSize="2" compressableMimeType="text/html,text/xml,text/javascript,text/css"
/>
如果缺省這個設置,那麼默認的解碼方式將是ISO-8859-1;POST方式提交的內容是在消息體中,它不會受URIEncoding解碼的影響。它的解碼方式目前我只知道通過request.setCharEncoding()這樣來設置。如果不設置,默認的編碼方式也是ISO-8859-1。知道了提交內容的編解碼過程,解決它們就相當容易了。有兩種方法:1、設置服務器解碼方式,對以GET方式提交的內容,在tomcat的配置文件中配置其解碼方式。對於以POST方式提交的內容,以request.setCharEncoding()來設置解碼方式。2、逆編碼:由上述分析可知,在不做任何設置的情況下,兩種方式都是想先經過contentType設置的編碼方式編碼,再以ISO-8859-1方式解碼。在服務器獲取到數據後,先用ISO-8859-1編碼,再通過ContentType指定的方式解碼,也能使所提交中文正常顯示,亦可。爲證明我所言非虛,如下圖所示:
<form action="/http/HttpCode" method="get">
<input type="text" name="name">
<input type="text" name="age">
<input type="submit" value="提交">
</form>
方碩璇-----23
以上闡述可以解釋我在項目開發過程中所有遇見過的亂碼問題,如果哪位兄弟遇見過除此之外亂碼問題,請告訴我,以便使這篇文檔更完整,不勝感激。如有雷同,不勝榮幸。