接觸JSP難免會遇到Java的中文亂碼問題,對於不同的情況,有不同的解決方案。以下是我所遇到的亂碼問題以及查閱的一些解決方案。
一、頁面編碼不一致導致的亂碼問題
這個亂碼問題是最簡單的亂碼問題,一般新手會出現。看以下JSP頁面代碼:
<%@ page language="java" pageEncoding="UTF-8"%><%@ page contentType="text/html;charset=iso8859-1"%><html> <head> <title>中文問題</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> </head> <body> 中文欄位 </body></html>
中文亂碼原因:
上述頁面裡三個地方出現了編碼
1.pageEncoding="UTF-8":pageEncoding屬性的作用是指定JSP頁面的編碼格式(或者說是以什麼編碼格式儲存)Java IDE(如MyEcljpse)會根據這個編碼格式儲存檔案。並編譯jsp檔案,包括裡面的漢字。
2.contentType="text/html;charset=iso8859-1":contentType屬性的作用是指定伺服器出請求完成後回應給瀏覽器的內容類型。因為pageEncoding指定了儲存格式為UTF-8,但是contentType卻指定JSP檔案被解碼為iso8859-1,這樣如有中文肯定出亂碼,所以兩者必須一致。
3.content="text/html; charset=UTF-8":content控制瀏覽器的解碼方式。如果前面的解碼都一致並且無誤的話,這個編碼格式不會產生影響。但有的網頁出現亂碼,就是因為瀏覽器不能確定使用哪種編碼格式。因為頁面有時候會嵌入頁面,導致瀏覽器混淆了編碼格式。出現了亂碼。
中文亂碼解決方案:
步驟一、統一JSP頁面中的pageEncoding、contentType和content的編碼格式。修正後的代碼如下:
<%@ page language="java" pageEncoding="UTF-8"%><%@ page contentType="text/html;charset=UTF-8"%><html> <head> <title>中文問題</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> </head> <body> 中文欄位 </body></html>
步驟二、設定IDE(筆者用的是MyEclipse)的JSP頁面的編碼格式,將其統一設定為UTF-8。具體的設定方法可參見一下連結的文章:
(Eclipse)http://blog.csdn.net/cxwen78/article/details/6400798
(MyEclipse)http://cavonchen.iteye.com/blog/681810
二、表單使用Post方式提交後接收到的亂碼問題
<%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%><html> <head> <title>request擷取表單資料樣本</title> </head> <body> <font size="2"> 下面是表單內容: <form action="Form.jsp" method="post"> 使用者名稱:<input type="text" name="userName" size="10"/> 密 碼:<input type="password" name="password" size="10"/> <input type="submit" value="提交"> </form> 下面是表單提交以後用request取到的表單資料:<br> <% out.println("表單輸入userName的值:"+request.getParameter("userName")+"<br>"); out.println("表單輸入password的值:"+request.getParameter("password")+"<br>"); out.println("HTML傳遞資料所用方法:"+request.getMethod()+"<br>"); out.println("請求使用的協議:"+request.getProtocol()+"<br>"); %> </font> </body></html>
運行結果:使用者名稱輸入“中文”,提交後,下面的“userName的值”後面就出現了亂碼。
這個問題也是一個常見的問題。這個亂碼也是tomcat的內部編碼格式iso8859-1在搗亂,也就是說post提交時,如果沒有設定提交的編碼格式,則會以iso8859-1方式進行提交,接受的jsp卻以utf-8的方式接受。導致亂碼。既然這樣的原因,下面有幾種解決方式,並比較。
1、接受參數時進行編碼轉換:String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ; 這樣的話,每一個參數都必須這樣進行轉碼。很麻煩。但確實可以拿到漢字。
2、接受參數時進行編碼轉換:在請求頁面上開始處,執行請求的編碼代碼, request.setCharacterEncoding("UTF-8"),把提交內容的字元集設為UTF-8。這樣的話,接受此參數的頁面就不必在轉碼了。直接使用String
str = request.getParameter("something");即可得到漢字參數。但每頁都需要執行這句話。這個方法也就對post提交的有效果,對於get提交和上傳檔案時的enctype="multipart/form-data"是無效的。
採取這種方式解決修改後的代碼如下:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%><html> <head> <title>request擷取表單資料樣本</title> </head> <body> <font size="2"> 下面是表單內容: <form action="Form.jsp" method="post"> 使用者名稱:<input type="text" name="userName" size="10"/> 密 碼:<input type="password" name="password" size="10"/> <input type="submit" value="提交"> </form> 下面是表單提交以後用request取到的表單資料:<br> <% request.setCharacterEncoding("UTF-8"); out.println("表單輸入userName的值:"+request.getParameter("userName")+"<br>"); out.println("表單輸入password的值:"+request.getParameter("password")+"<br>"); out.println("HTML傳遞資料所用方法:"+request.getMethod()+"<br>"); out.println("請求使用的協議:"+request.getProtocol()+"<br>"); %> </font> </body></html>
對比可知,添加了request.setCharacterEncoding("UTF-8"),運行結果如下:正確顯示“中文”
3、接受參數時進行編碼轉換:為了避免每頁都要寫request.setCharacterEncoding("UTF-8"),建議使用過濾器對所有jsp進行編碼處理。這個網上有很多例子。請大家自己Baidu和Google查閱。
關於JSP中文亂碼的問題還有一些,比如表單get提交方式的亂碼、指令碼代碼關於url請求,接受到的參數亂碼、上傳檔案時的亂碼、資料庫亂碼等等,未完待續...