jsp中文亂碼六種情況---解決方案


jsp中文亂碼六種情況---解決方案

來源:http://blog.csdn.net/lovesummerforever/article/details/12290319 


 亂碼是讓人頭疼的一件事情,您是否和我一樣也遇到過這樣的情況,向數據庫中添加一條記錄,記錄是添加上了,到數據庫里一看,數據凌亂了。。。頓時我也凌亂了。。。把html文件改為jsp文件,添加了一下jsp page指令重新打開同時發現所有的中文都七十二變了。。是否。。下面我們就一起看看Java web中的中文亂碼問題。

 

 

1、JSP頁面出現的中英文亂碼:

        我們的PageCharset.jsp頁面代碼如下所示:

[html]  view plain  copy
 print ?
  1. <%@ page language="java" import="java.util.*"%>  
  2.     
  3. <html>  
  4. <head>  
  5.   
  6. <title>中文顯示示例</title>  
  7. </head>  
  8.   
  9. <body>  
  10.     中文顯示的示例。  
  11.     <%  
  12.         out.print("這里是用jsp輸出的中文");  
  13.      %>  
  14. </body>  
  15. </html>  


        當我們在保存我們的文件的時候會出現下面的提示:

 


        整因為在我們的MyEclipse中默認的編碼為ISO-8859-1,而ISO-8859-1不支持中文的編碼,所以jsp頁面代碼如果出現中文就不能保存了。對於這樣的錯誤,我們只要在頁面上加上支持中文的編碼格式就可以了,在jsp頁面中加上pageEncoding=“gb2132” 支持中頁面的編碼格式就可以了。這樣我們就能正常保存我們的jsp源文件了。

 

 

 

2、URL傳遞參數中文亂碼

 

[html]  view plain  copy
 print ?
  1. <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>  
  2.     
  3. <html>  
  4. <head>  
  5.   
  6. <title>URL傳遞參數中英文處理示例</title>  
  7. </head>  
  8.     <%  
  9.         String param = request.getParameter("param");  
  10.      %>  
  11. <body>  
  12.     <a href="URLCharset.jsp?param='中文'">請單擊這個鏈接</a>  
  13.     您提交的這個參數為:<%=param %>  
  14. </body>  
  15. </html>  


 

        啟動tomcat運行結果出現url傳遞的中文亂碼:

 

        這里我們需要配置tomcat服務器文件,才能解決這個問題。具體方法是,在tomcat的conf目錄下找到server.xml配置文件,找到如下代碼

[html]  view plain  copy
 print ?
  1. <span style="font-size:18px">  <Connector port="8080" protocol="HTTP/1.1"  
  2.                connectionTimeout="20000"  
  3.                redirectPort="8443"  /></span>  


        在后面添加上編碼方式,URIEncoding="gb2312" 重新啟動tomcat問題就解決了。

 

 

 

3、表單提交中問亂碼

        對於表單中提交的數據,可以用request.getPraramter("");方法來獲取,但是當表單中出現中文數據的時候就會出現亂碼。

        我們的提交表單的頁面,FormCharset.jsp頁面如下:

[html]  view plain  copy
 print ?
  1. <%@ page language="java" contentType="text/html; charset=GB18030"  
  2.     pageEncoding="GB18030"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">  
  7. <title>Form中文處理示例</title>  
  8. </head>  
  9. <body>  
  10.     下面是表單內容:  
  11.     <form action="AcceptFormCharset.jsp" method="post">  
  12.         用戶名:<input type="text" name="userName" size="10" />  
  13.         密    碼:<input type="password" name="password" size="10"/>  
  14.         <input type="submit" value="提交"/>  
  15.     </form>  
  16. </body>  
  17. </html>  


        我們的AcceptFormCharset.jsp頁面:

[html]  view plain  copy
 print ?
  1. <%@ page language="java" contentType="text/html; charset=GB18030"  
  2.     pageEncoding="GB18030"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">  
  7. <title>Form中文處理示例</title>  
  8. </head>  
  9. <body>  
  10.     下面是表單提交以后request取到的表單的數據:<br>  
  11.     <%  
  12.         out.println("表單輸入的userName值為:" + request.getParameter("userName") +"<br>");  
  13.         out.println("表單輸入的pasword值為:" +request.getParameter("password") + "<br>");  
  14.      %>  
  15. </body>  
  16. </html>  


 

        提交表單:

 

        結果如下:

 

        我們看到我們在表單中的中文數據出現了亂碼,為什么楚翔這種情況呢?是因為我們的tomcat中,對於以post方式提交的表單編碼格式默認為ISO-8859-1的編碼格式,而這種編碼格式是不能編碼中文的,所以就會出現亂碼的現象了。對於這種情況,我們可以對表單中的數據進行處理,在取得表單參數的時候設置編碼方式,我們更改了我們的接受表單數據的頁面如下所示:

 

[html]  view plain  copy
 print ?
  1. <%  
  2.     String userName = request.getParameter("userName");  
  3.     String passWord = request.getParameter("password");  
  4.     out.println("表單輸入的userName值為:" +  new String(userName.getBytes("ISO-8859-1"),"gb2312")+"<br>");  
  5.     out.println("表單輸入的pasword值為:" + new String(passWord.getBytes("ISO-8859-1"),"gb2312")+"<br>");  
  6.  %>  


        這樣就得到我們想要的效果啦:

 

 

 

 

 4、數據庫操作中文亂碼

        我們在建立數據庫的時候,最好是能選擇支持中文編碼格式,最好是能和jsp頁面編碼格式保持一致,這樣就盡可能的減少數據庫操作中文亂碼的問題,最開始的連接數據庫的時候,編寫好數據庫的編碼策略,也就是使用這種形式的URL:jdbc:Oracle:thin:@localhost:1521:TEST;userEnicode=true;characterEncoding=gb2312; 這樣我們選擇的數據庫的編碼和我們的jsp編碼就一致了。

 

寫入到數據庫的時候,數據庫中中文亂碼:

        但是如果我們在最開始的時候沒有對數據庫的編碼進行設置,並且我們的數據庫中已經有大量的數據的話,我們再向數據庫中寫入中文數據,數據庫中的中文顯示為亂碼。在寫入數據的時候出現亂碼,是因為我們在處理表單的時候沒有對字符的編碼設置,對於這種情況,我們在jsp中或servlet中加入:

rquest.setCharacterEncoding("gb2312");//處理表單請求的時候設置編碼。

        這樣再看我們的數據庫,插入的中文字段就不會亂碼了。

 

 

從數據庫中讀出中文亂碼:

        數據庫中的中文出現亂碼,就是在讀取數據庫的時候進行轉碼,這樣顯示就不會亂碼了。我們整理這樣的一個轉碼函數:

public String encoder(String str) throws UnsupportedEncodingException

{

           String result = new String(str.getBytes("ISO-ISO-8859-1)"),"gb2312");

}

 

 

 

 

 

5 在myeclipse開發工具中打開中文顯示亂碼

        在myeclipse中默認的編碼方式為ISO-8859-1,所以打開有其他編譯器編碼的jsp頁面就會出現亂碼,是因為兩個編譯器保存源文件編碼格式不同,在UltralEdit可以支持中文,但是在Eclipse對jsp文件的保存方式為ISO-8895-1,這種編碼不支持中文,所以就會出現亂碼。

        對於這種情況,我們可以更改myeclipse默認的編碼方案,myeclipse->Window->Preferences->General->Content types->Test->JSP

 

        這樣問題就解決啦!

 

 

 

 

6 Filter批量設置編碼格式

        我們對於每一個jsp或servlet我們都要設置編碼格式,效率有些低,我們的servlet的Filter解決了我們的問題。在前篇寫過Filter的解決中文亂碼問題的文章,在這里就不贅述了。http://blog.csdn.NET/lovesummerforever/article/details/9924413 

        需要強調的一點,開始使用Java model1模型的時候,我們在web.xml中配置只需要配置好jsp頁面就可以了,在model2模型中我們使用servlet作為控制器,我們就需要在Filter的配置文件web.xml中配置好servlet的設置,對所有的servlet處理的表單編碼進行設置。

[html]  view plain  copy
 print ?
  1. <filter>  
  2.         <filter-name>CharsetEncodingFilter</filter-name>  
  3.         <filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>encoding</param-name>  
  6.             <param-value>GBK</param-value>  
  7.         </init-param>  
  8.     </filter>  
  9.     <filter-mapping>  
  10.         <filter-name>CharsetEncodingFilter</filter-name>  
  11.         <url-pattern>*.jsp</url-pattern>  
  12.     </filter-mapping>  
  13.   
  14.     <filter-mapping>  
  15.         <filter-name>CharsetEncodingFilter</filter-name>  
  16.         <url-pattern>/servlet/*</url-pattern>  
  17.     </filter-mapping>
    	</article>


<!-- !empty($pre_next_article[0]) -->
	</div>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM