瀏覽器正常顯示
response.setContentType("text/html;charset='utf-8'")
response.setCharacterEncoding("utf-8");
服務器端正常接收
中文亂碼有三種情況
1)表單提交(get方式,post方式):input表單輸入為中文
2)超鏈接(get);鏈接?參數名=值(中文)
3)sendRedict(get) 鏈接?參數名=值(中文)
亂碼產生的根本原因
請求發送時:瀏覽器有默認的編碼,經上述設置之后,是utf-8。
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");
補充關於亂碼的相關知識點:
一、當我們下載文件的時候,可能提示框是中文亂碼,此時的解決方法是:
String temp=java.net.URLEncoding.encode("中文文件名","utf-8")
response.setHeader("Content-Disposition","attachment;filename="+temp);
二、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對象初始化之前進行編碼的設置。
