Java亂碼是因為Java和JSP源檔案的儲存方式是基於位元組流的,如果Java和JSP編譯成class檔案過程中,使用的編碼方式與源檔案的編碼不一致,就會出現亂碼。在這裡,總結一下java亂碼的一些常見情況
1.Javascript傳參亂碼:
在瀏覽器端對要傳遞的中文參數進行編碼處理.代碼如下:
xmlhttp.open("POST",url,true); //請求參數初始化
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //因為請求方式為POST,所以這裡要佈建要求頭.(如果請求方式為GET,此句代碼可以省略)
xmlhttp.send("name="+encodeURI(encodeURI("星期日"))); //向伺服器端發送參數
在伺服器端代碼:
頁面jsp保證是utf-8編碼
<%@ page contentType="text/html; charset=GBK"%>
接受中文參數
PrintWriter out = response.getWriter(); //得到response的輸出資料流對象
String name1 = request.getParameter("name"); //得到KEY為"name"的請求參數
String name = URLDecoder.decode(name1,"utf-8"); //對得到的參數進行解碼
out.print(name); //向瀏覽器端發送資料
2.JSP與頁面參數之間的亂碼
JSP擷取頁面參數時一般採用系統預設的編碼方式,如果頁面參數的編碼類別型和系統預設的編碼類別型不一致,很可能就會出現亂碼。解決這類亂碼問題的基本方法是在頁面擷取參數之前,強制指定request擷取參數的編碼方式:request.setCharacterEncoding("UTF-8") 。
如果在JSP將變數輸出到頁面時出現了亂碼,可以通過設定response.setContentType("text/html;charset=UTF-8")。
JSP頁面亂碼通常只要在頁面開始地方用上面代碼指定字元集編碼即可。如果還不行,那麼請用下面這句話來轉換 str=new String(str.getBytes("ISO-8859-1"),"頁面編碼方式");
3.熱連結傳參亂碼
在傳參的jsp對中文進行編碼:href="new.jsp?name=java.net.URLEncoder.encode("連結")";
在接受的jsp對中文進行轉碼:String str = URLDecoder.decode(request.getParameter("name "), "utf-8");
4.Java與資料庫之間的亂碼
大部分資料庫都支援以unicode編碼方式,所以解決Java與資料庫之間的亂碼問題比較明智的方式是直接使用unicode編碼與資料庫互動。很多資料庫驅動自動支援unicode,如Microsoft的SQLServer驅動。其他大部分資料庫驅動,可以在驅動的url參數中指定,如mysql驅動:jdbc:mysql://localhost/MYAPPS?useUnicode=true&characterEncoding=GBK。
5.Java與檔案/流之間的亂碼
Java讀寫檔案最常用的類是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基於位元組流的,常用於讀寫二進位檔案。讀寫字元檔案建議使用基於字元的FileReader和FileWriter,省去了位元組與字元之間的轉換。但這兩個類的建構函式預設使用系統的編碼方式,如果檔案內容與系統編碼方式不一致,可能會出現亂碼。在這種情況下,建議使用FileReader和FileWriter的父類:InputStreamReader/OutputStreamWriter,它們也是基於字元的,但在建構函式中可以指定編碼類別型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。