標籤:
在JAVA WEB開發的過程中,經常會遇到中文亂碼的情況,中文亂碼主要是在瀏覽器與伺服器互動傳遞資料的時候發生的。對於這個棘手的問題,我參考(韓順平老師)視頻將處理方法總結與此,供自己以及大家開發的時候借鑒。
一、發生中文亂碼的三種情況
(1)表單提交(form),其中又分為兩種情況,post提交和get提交;
(2)超連結傳遞參數,例如:www.cnblogs.com?postid=1234567;
(3)sendRedirect()方法,重新導向url帶有參數的時候。
二、亂碼原因及處理方法
(1)表單post提交亂碼
原因:web伺服器預設採用的是ISO-8859-1的編碼方式解析post資料,所以亂碼出現是由於瀏覽器所傳遞資料編碼方式與伺服器接收編碼方式不一致。
處理方案:在servlet或jsp中加上 request.setCharacterEncoding("utf-8"); 這裡假定瀏覽器所顯示資料的編碼格式是utf-8。
(2)表單get提交亂碼
原因:同上一樣,由於get提交的資料沒有放在請求體內,而是放在請求行中,所以使用上面的方式不能解決
處理方案:編寫一個轉碼工具類,如下
1 public class CodingTool { 2 public static String transcoding(String str) { 3 try { 4 return new String (str.getBytes("iso-8859-1"),"utf-8"); 5 } catch (UnsupportedEncodingException e) { 6 e.printStackTrace(); 7 return null; 8 } 9 }10 }
(3)超連結傳參亂碼情況和get提交亂碼原因及解決方案都一樣
(4)sendRedirect()方法提交Url中參數出現亂碼
原因:sendRedirect()方法重新導向時會先回到瀏覽器,再由瀏覽器向下一個servlet發送http請求,在第二次請求的servlet中根據post請求或get請求方式進行處理。
三、特殊情況
當用戶端瀏覽器是ie6或以下版本的時候,使用超連結和sendRedirect()傳參這兩種情況任然會出現亂碼(當中文是奇數的時候),解決方案有兩種:
(1)全面換成GBK編碼,在servlet中這樣進行接收:
String username = new String (request.getParameter("username").getBytes("iso-8859-1"), "gbk")
(2)仍然使用utf-8編碼,就需要對要發送的中文進行URLEncoding
在發送資訊的servlet中,對含有中文的URI進行如下轉碼操作:
String info = java.net.URLEncoder.encode("圖片.jpg", "utf-8");
然後使用超連結將info轉寄出去
response.getWriter().println("<a href=‘/EncodingPro/Test1?imageName=" + info +"‘>test</a>");
或sendRedirect()方法:
response.sendRedirect("/EncodingPro/Test1?imageName=" + info );
接收方:
String info = new String (request.getParameter("imageName").getBytes("iso-8859-1"), "utf-8");
J2EE中文亂碼處理