JSP中文亂碼問題終極解決方案

來源:互聯網
上載者:User

標籤:style   blog   class   java   tar   ext   

在介紹方法之前我們首先應該清楚具體的問題有哪些,筆者在本部落格當中論述的JSP中文亂碼問題有如下幾個方面:頁面亂碼、參數亂碼、表單亂碼、源檔案亂碼。下面來逐一解決其中的亂碼問題。

一、JSP頁面中文亂碼

在JSP頁面中,中文顯示亂碼有兩種情況:一種是HTML中的中文亂碼,另一種是在JSP中動態輸出的中文亂碼。

先看一個JSP程式:

 

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*"  %> 
  2. <html> 
  3.     <head> 
  4.     <title>中文顯示樣本</title> 
  5.  
  6.     </head>  
  7.     <body> 
  8.     這是一個中文顯示樣本: 
  9.     <% 
  10.         String str = "中文"; 
  11.         out.print(str); 
  12.     %> 
  13.     </body> 
  14. </html> 
<%@ page language="java" import="java.util.*"  %><html><head><title>中文顯示樣本</title></head> <body>這是一個中文顯示樣本:<%String str = "中文";out.print(str);  %></body></html>

 

上面這個JSP程式看起來好像是在頁面顯示幾句中文而且標題也是中文。運行後在瀏覽器中顯示

 

原因在於沒有在JSP中指定頁面顯示的編碼,消除亂碼的解決方案很簡單上面代碼中page命令修改成如下所示即可

 

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %> 
  2. <html> 
  3.     <head> 
  4.     <title>中文顯示樣本</title> 
  5.  
  6.     </head>  
  7.     <body> 
  8.     這是一個中文顯示樣本: 
  9.     <% 
  10.         String str = "中文"; 
  11.         out.print(str); 
  12.     %> 
  13.     </body> 
  14. </html> 
<%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %><html><head><title>中文顯示樣本</title></head> <body>這是一個中文顯示樣本:<%String str = "中文";out.print(str);  %></body></html>

 

再次運行亂碼消失,原理就是向頁面指定編碼為GB2312,那麼頁面就會按照此編碼來顯示,於是亂碼消失。

二、URL傳遞參數中文亂碼

一般情況下在使用get方法提交表單的時候傳遞的參數如果是中文的話很可能會出現亂碼。

下面是一個樣本程式

 

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> 
  2. <html> 
  3.     <head>  
  4.         <title>URL傳遞參數中文處理樣本</title> 
  5.     </head> 
  6.     <% 
  7.         String param = request.getParameter("param"); 
  8.     %> 
  9.     <body> 
  10.         <a href="URLCharset.jsp?param=‘中文‘">請點擊這個連結</a><br> 
  11.         你提交的參數為:<%=param%> 
  12.     </body> 
  13. </html> 
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%><html><head> <title>URL傳遞參數中文處理樣本</title></head><%String param = request.getParameter("param");%><body><a href="URLCharset.jsp?param=‘中文‘">請點擊這個連結</a><br>你提交的參數為:<%=param%></body></html>

 

上面這個JSP程式的功能就是通過一個URL連結向自身傳遞一個參數,這個參數是中文字串,這個程式的運行效果如

 

對於URL傳遞中文參數亂碼這個問題,其處理方法比較特殊,僅僅轉換這個中文字串或者設定JSP頁面顯示編碼都是不能解決問題的,需要修改Tomcat伺服器的設定檔才能解決問題。在這裡修改Tomcat的conf目錄下的server.xml設定檔,具體改後的代碼如下

 

[html] view plaincopyprint?
  1. <Connector port="8080" protocol="HTTP/1.1" URIEncoding="gb2312" 
  2.                connectionTimeout="20000"   
  3.                redirectPort="8443" /> 
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="gb2312"               connectionTimeout="20000"                 redirectPort="8443" />

 

在原來代碼中添加URI編碼設定URIEncoding=“gb2312”即可,重啟Tomcat伺服器可以得到正確的頁面。其原理也和上面的情況類似,就是向程式指明編碼類別型,然後顯示就正常了。

三、表單提交中文亂碼

對於表單的資料可以使用request.getParameter(“”)的方法擷取,但是當表單中出現中文資料的時候就會出現亂碼。

範例程式碼如下

 

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> 
  2. <html> 
  3.     <head>    
  4.         <title>Form中文處理樣本</title> 
  5.     </head>  
  6.     <body> 
  7.         <font size="2"> 
  8.                 下面是表單內容: 
  9.             <form action="AcceptFormCharset.jsp" method="post"> 
  10.                 使用者名稱:<input type="text" name="userName" size="10"/> 
  11.                 密  碼:<input type="password" name="password" size="10"/> 
  12.                 <input type="submit" value="提交"> 
  13.             </form>   
  14.         </font> 
  15.     </body> 
  16. </html> 
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%><html><head>   <title>Form中文處理樣本</title></head> <body><font size="2">下面是表單內容:<form action="AcceptFormCharset.jsp" method="post">使用者名稱:<input type="text" name="userName" size="10"/>密  碼:<input type="password" name="password" size="10"/><input type="submit" value="提交"></form>  </font></body></html>

 

在上面的表單當中想AcceptFormCharset這個頁面提價兩項資料,下面是AcceptFormCharset.jsp的內容:

 

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" 
  2.     contentType="text/html;charset=gb2312"%> 
  3. <html> 
  4.     <head> 
  5.         <title>Form中文亂碼</title> 
  6.     </head> 
  7.     <body> 
  8.         <font size="2"> 下面是表單提交以後用request取到的表單資料:<br> 
  9.             <% 
  10.                 String userName = request.getParameter("userName"); 
  11.                 String password = request.getParameter("password"); 
  12.                 out.println("表單輸入userName的值:" + userName + "<br>"); 
  13.                 out.println("表單輸入password的值:" + password + "<br>"); 
  14.              %>  
  15.         </font> 
  16.     </body> 
  17. </html> 
<%@ page language="java" import="java.util.*"contentType="text/html;charset=gb2312"%><html><head><title>Form中文亂碼</title></head><body><font size="2"> 下面是表單提交以後用request取到的表單資料:<br><%String userName = request.getParameter("userName"); String password = request.getParameter("password"); out.println("表單輸入userName的值:" + userName + "<br>"); out.println("表單輸入password的值:" + password + "<br>");  %>  </font></body></html>

 

在上面的程式中,如果表單輸入沒有中文,則可以正常的顯示當輸入的資料中有中文的時候,得到的結果。

 

產生種結果的原因是Tomcat中對於post方法提交的表單採用的預設編碼為ISO-8859-1,而這種編碼格式不支援中文字元。對於這個問題可以採用轉換編碼格式的方法來解決,現在對AcceptFromCharset這個頁面改動如下:

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" 
  2.     contentType="text/html;charset=gb2312"%> 
  3. <html> 
  4.     <head> 
  5.         <title>Form中文亂碼</title> 
  6.     </head> 
  7.     <body> 
  8.         <font size="2"> 下面是表單提交以後用request取到的表單資料:<br> 
  9.             <% 
  10.                 String userName = request.getParameter("userName"); 
  11.                 String password = request.getParameter("password"); 
  12.                 out.println("表單輸入userName的值:" + new String(userName.getBytes("ISO-8859-1"), "gb2312")+ "<br>"); 
  13.                 out.println("表單輸入password的值:" + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "<br>"); 
  14.              %>  
  15.         </font> 
  16.     </body> 
  17. </html> 
<%@ page language="java" import="java.util.*"contentType="text/html;charset=gb2312"%><html><head><title>Form中文亂碼</title></head><body><font size="2"> 下面是表單提交以後用request取到的表單資料:<br><%String userName = request.getParameter("userName"); String password = request.getParameter("password"); out.println("表單輸入userName的值:" + new String(userName.getBytes("ISO-8859-1"), "gb2312")+ "<br>");  out.println("表單輸入password的值:" + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "<br>");  %>  </font></body></html>

 

經過這樣的轉換編碼以後,所有的中文輸入都可以用request對象正常取出。在上面這個程式中,第四行和第五行是轉換編碼格式的關鍵,先從ISO-8859-1格式的字串中取出位元組內容,然後在用GB2312的編碼格式重新構造一個新的字串。這樣就可以支援中文變淡輸入的正常取值和顯示。改進以後程式運行結果如下

 

經過上面的更改編碼格式的處理,表單的中文輸入亂碼問題已經得到解決。但是如果上面的表單中的輸入項不止是兩個,那麼每個輸入項都需要進行編碼轉換,那樣就很麻煩了。這是我們就用到了大名鼎鼎的過濾器filter了。關於這裡的內容大致的思慮和上面的一樣具體做法請參照筆者的另一篇文章。

四、Eclipse中JSP檔案中文亂碼

在Eclipse或者MyEclipse中由於預設的JSP編碼格式為ISO-8859-1,所以當開啟由其他編輯器編輯的JSP檔案時會出現亂碼,

 

對於這個問題我們只需要更改一下Eclipse或者是MyEclipse中對JSP的預設編碼就可以了,修改的地方(我的MyEclipse版本為11)

 

PS

在Eclipse或者MyEclipse當中JSP檔案預設的編碼為ISO-8859-1,所以在JSP代碼中間如果出現中文就不能儲存,例如如下代碼

 

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" %> 
  2. <html> 
  3.     <head> 
  4.     <title>中文顯示樣本</title> 
  5.  
  6.     </head>  
  7.     <body> 
  8.     這是一個中文顯示樣本: 
  9.     <% 
  10.         String str = "中文"; 
  11.         out.print(str); 
  12.     %> 
  13.     </body> 
  14. </html> 
<%@ page language="java" import="java.util.*" %><html><head><title>中文顯示樣本</title></head> <body>這是一個中文顯示樣本:<%String str = "中文";out.print(str);  %></body></html>

 

修改後在儲存的時候會提示如下:

 

現這個提示的原因在於JSP源檔案中有ISO=8859-1編碼無法識別的中文字元,對於這個問題,解決辦法就是在JSP頁面中聲明頁面編碼格式即可。聲明後代碼如下:

 

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*"  pageEncoding="GB2312" %> 
  2. <html> 
  3.     <head> 
  4.     <title>中文顯示樣本</title> 
  5.  
  6.     </head>  
  7.     <body> 
  8.     這是一個中文顯示樣本: 
  9.     <% 
  10.         String str = "中文"; 
  11.         out.print(str); 
  12.     %> 
  13.     </body> 
  14. </html> 
<%@ page language="java" import="java.util.*"  pageEncoding="GB2312" %><html><head><title>中文顯示樣本</title></head> <body>這是一個中文顯示樣本:<%String str = "中文";out.print(str);  %></body></html>

 

其中第一行中pageEncoding=“gb2312”指明了JSP頁面編碼採用GB2312,這樣就可以正常儲存JSP的源檔案了。

 

遇到問題首先分析問題出現的原因,只有知道了原因才能去解決,學習分析問題的來源遠比解決這個問題重要的多。

亂碼問題的原因就是程式(Eclipse也好,瀏覽器也罷)的編碼沒有和編程人員的編碼進行統一,(就像你和一個不懂中文的人用中文交流他當然不懂了)那麼解決這個問題只需要將編程人員想要的編碼告訴程式就可以了,以上解決亂碼問題的種種方法都可以說是一種聲明編碼的過程,也就是說亂碼問題終極解決方案就是:轉碼。這裡的轉碼要麼是編程人員手動轉,要麼就是聲明一下讓程式去轉,換句話說就是:和不懂中文的交流,要麼讓他學中文,要麼你就去學習他的語言。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.