瀏覽器正常顯示html
response.setContentType("text/html;charset='utf-8'")java
response.setCharacterEncoding("utf-8");web
服務器端正常接收瀏覽器
中文亂碼有三種狀況服務器
1)表單提交(get方式,post方式):input表單輸入爲中文ide
2)超連接(get);連接?參數名=值(中文)工具
3)sendRedict(get) 連接?參數名=值(中文)post
亂碼產生的根本緣由編碼
請求發送時:瀏覽器有默認的編碼,經上述設置以後,是utf-8。url
web服務器接收時候,也有一種編碼,因爲服務器通常是國外開發的,所以默認的編碼方式通常是iso-8859-1
瀏覽器與服務器的編碼方式不一致,於是產生亂碼
問題解決方法
1,若是是表單提交,方法是post(表單提交應當儘可能選擇post)
此時經過http請求體傳遞參數,由於服務器會將對應的http請求頭解析並進一步包裝爲request對象,所以利用request.setCharacterEncoding方法,指定web服務器接受端的編碼方式,如request.setCharacterEncoding("utf-8")
2,若是是表單提交,方法是get
此時經過連接傳遞參數,針對亂碼狀況,能夠利用
String value=new String(request.getParameter("參數名").getBytes("iso-8859-1"),"utf-8")來解決
這種狀況能夠封裝成一個工具類
package com.bobo.utils; import java.io.UnsupportedEncodingException; public class MyTools { public static String getNewString(String str){ try { return new String(str.getBytes("iso-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } }
3,超連接亂碼,sendRedict的亂碼本質上也是get請求,解決方法同2
4,若是是ie6及如下版本,上述方法中涉及到get方法時依然有可能出現亂碼,此時的解決方法是:
對要發送的中文進行編碼
String info=java.net.URLEncoder.encode("你好","utf-8");
response.sendRedict("url路徑?參數名="+info);
第三個文件接收
String info=new String(request.getParameter("參數名").getBytes("iso-8859-1"),"utf-8");
補充關於亂碼的相關知識點:
1、當咱們下載文件的時候,可能提示框是中文亂碼,此時的解決方法是:
String temp=java.net.URLEncoding.encode("中文文件名","utf-8")
response.setHeader("Content-Disposition","attachment;filename="+temp);
2、request.getRequestDispatcher()以後出現亂碼
對於某一個頁面,在單獨訪問的時候是正常的,但是講過上述語句轉向以後出現亂碼
在Servlet中,通常有參數傳遞的話,會設置頁面接收參數和傳遞參數的編碼。即下面兩句:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("utf-8");
通常狀況下,大部分都會想到使用這個,可是這兩句代碼的位置有時卻容易被忽視,我今天就是忽視了這兩句的位置。正確的寫法是,request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("utf-8");要放在PrintWriter out = response.getWriter();的後面。由於out對象初始化以後,再設置編碼已經沒有任何意義了!因此必須在out對象初始化以前進行編碼的設置。