簡簡單單----(七)jsp中文亂碼六種情況---解決方案

來源:互聯網
上載者:User


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

 

 

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

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

<%@ page language="java" import="java.util.*"%>  <html><head><title>中文顯示樣本</title></head><body>中文顯示的樣本。<%out.print("這裡是用jsp輸出的中文"); %></body></html>


當我們在儲存我們的檔案的時候會出現下面的提示:

 


整因為在我們的MyEclipse中預設的編碼為

 

 

 

2、URL傳遞參數中文亂碼

 

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>  <html><head><title>URL傳遞參數中英文處理樣本</title></head><%String param = request.getParameter("param"); %><body><a href="URLCharset.jsp?param='中文'">請單擊這個連結</a>您提交的這個參數為:<%=param %></body></html>


 

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

這裡我們需要配置tomcat伺服器檔案,才能解決這個問題。具體方法是,在tomcat的conf目錄下找到server.xml設定檔,找到如下代碼



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

 

 

 

3、表單提交中問亂碼

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

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

<%@ page language="java" contentType="text/html; charset=GB18030"    pageEncoding="GB18030"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>Form中文處理樣本</title></head><body>下面是表單內容:<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></body></html>


我們的AcceptFormCharset.jsp頁面:

<%@ page language="java" contentType="text/html; charset=GB18030"    pageEncoding="GB18030"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>Form中文處理樣本</title></head><body>下面是表單提交以後request取到的表單的資料:<br><%out.println("表單輸入的userName值為:" + request.getParameter("userName") +"<br>");out.println("表單輸入的pasword值為:" +request.getParameter("password") + "<br>"); %></body></html>


 

提交表單:

 

結果如下:

 

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

 

<%String userName = request.getParameter("userName");String passWord = request.getParameter("password");out.println("表單輸入的userName值為:" +  new String(userName.getBytes("ISO-8859-1"),"gb2312")+"<br>");out.println("表單輸入的pasword值為:" + new String(passWord.getBytes("ISO-8859-1"),"gb2312")+"<br>"); %>


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

 

 

 

 

 4、資料庫操作中文亂碼

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

 

寫入到資料庫的時候,資料庫中中文亂碼:

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

這樣再看我們的資料庫,插入的中文欄位就不會亂碼了。

 

 

從資料庫中讀出中文亂碼:

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

 

 

 

 

 

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處理的表單編碼進行設定。

<filter><filter-name>CharsetEncodingFilter</filter-name><filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param></filter><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping>

 

學習了亂碼的各種情況,以後出現亂碼再也不害怕了,即使出現新的亂碼問題,我們就會這樣分析,編譯器本身是什麼編碼格式的,是和本身的編碼不同,還是設定了靜態頁面的編碼,沒有設定一些動態資料的編碼;是資料庫的編碼和自己傳遞給資料庫的編碼不同嗎?等等我們學會了他們之間怎麼相互去匹配,程式員如何翻譯的這個過程.......加油!

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.