淺析WEB開發中的中文亂碼問題

在開發WEB系統時,所要做的無非是瀏覽器和服務器之間不停地進行數據交互。當服務器向瀏覽器發送一段中文或者瀏覽器通過表單向服務器提交一段中文,如果不做適當處理,另一端獲取的只能是亂碼。亂碼產生的本質原因就是因爲編碼和解碼採用了不同的編碼方式,要想解決中文亂碼問題,就需要對WEB服務請求響應的編解碼過程熟悉。

當瀏覽器向服務器請求的網頁中包含有中文時,要想不出現亂碼,很簡單,只需要設置responsecontentType屬性即可。

   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的屬性值。在服務器端以何種方式解碼呢,這個要按照提交方式不同而分別討論了。向服務器提交內容的方式最常用的是GETPOSTGET將表單的信息放在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-1POST方式提交的內容是在消息體中,它不會受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

             
    

   以上闡述可以解釋我在項目開發過程中所有遇見過的亂碼問題,如果哪位兄弟遇見過除此之外亂碼問題,請告訴我,以便使這篇文檔更完整,不勝感激。如有雷同,不勝榮幸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章