1、Servlet輸出亂碼html
1. 用servlet.getOutStream字節流輸出中文,假設要輸出的是String str ="***是中國的,無恥纔是日本的"。java
1.1 如果本地服務器與本地客戶端這種就不用說了,直接能夠out.write(str.getBytes())能夠輸出沒有問題。由於服務器中用str.getBytes()是採用默認本地的編碼,好比GBK。而瀏覽器也解析時也用本地默認編碼,二者是統一的,因此沒有問題。數組
1.1 若服務器輸出時用了, out.write(str.getBytes("utf-8"))。而本地默認編碼是GBK時(比例在中國),那麼用瀏覽器打開時就會亂碼。由於服務器發送過來的是utf-8的1010數據,而客戶端瀏覽器用了gbk來解碼,二者編碼不統一,確定是亂碼。固然,你也能夠本身將客戶端瀏覽器的編碼手工調用下(IE菜單是:查詢View->編碼encoding->utf-8),可是這種操做很爛,最好由服務器輸出響應頭告訴,瀏覽器用哪一種編碼來解碼。因此要在服務器的servlet中,增長response.setHeader("content-type","text/html;charset=utf-8"),固然也可直接用簡單的response.setContentType("text/hmtl;charset=utf-8")。兩種的操做是同樣同樣的。瀏覽器
2. 用servlet.getWirter字符流輸出中文,假設要輸出的是String str ="***是中國的,無恥纔是日本的"。服務器
2.1 若寫成out.print(str)輸出時,客戶端瀏覽器顯示的將全是多個?????的字符,表明在編碼表中確定就找不到相應的字符來顯示。緣由是:servlet.getWriter()獲得的字符輸出流,默認對字符的輸出是採用ISO-8859-1,而ISO-8859-1確定是不支持中文的。因此確定要首先要作的第一件事:是要將服務器對象輸出字符能支持中文的。其次服務器向客戶端寫回的響應頭要告訴客戶端是用了哪一種編碼表進行編碼的。而實現這兩個需求,只須要response.setContentType("text/hmtl;charset=utf-8")。就搞定了。特別注意:response.setContentType("text/html;charset=utf-8")要放在PrintOut out = response.getWriter()代碼的前面,不然只是有告訴客戶端用什麼碼錶編碼的功能,而服務器端仍是用ISO-8859-1編碼了。再特別提示下:在同一Servlet中的doGet或doPost方法中,不能既用response.getOutputStream又用response.getWriter,由於這兩種response的響應輸出字節流與字符流是衝突的,只能用其一。cookie
2、Servlet文件下載,中文亂碼狀況。app
關鍵是下載時響應頭 content-disposition中attachment;filename=文件名。這個文件名filename不能是含有中文字符串的,要用URLEncoding編碼進行編碼,才能進行進行http的傳輸。以下代碼示例:編碼
3、Servlet的response增長addCookie,cookie中value的中文碼問題解決方法。url
關於cookie的原理,見http://blog.csdn.net/chenshufei2/article/details/8009992。 若想將cookie中存放中文的值,必須用Base64編碼後,發給客戶瀏覽器端進入存儲。而下次客戶端瀏覽訪問是帶回來的cookie中的值,是通過Base64編碼的,因此須要用Base64解碼便可。 Base64編碼主要是解決將特殊字符進行從新編碼,編碼成a-b、A-B、0-九、+與/,字符52,10個數字與一個+,一個/ 共64個字符。它的原理是將原來3個字節的內容編碼成4個字節。主要是取字節的6位後,在前面補00組成一個新的字節。因此這樣原來的3個字節共24,被編碼成4個字節32位了。spa
具體代碼示例以下:
4、獲取請求參數亂碼
GET方式的亂碼:
如<a href=」/demo5/servlet/RD2?name=中國」>CN,直接用request.getParameter獲得的字符串strCN將會亂碼,這也是由於GET方式是用http的url傳過來的默認用iso-8859-1編碼的,因此首先獲得的strCn要再用iso-8859-1編碼獲得原文後,再進行用utf-8(看具體頁面的charset是什麼utf-8或gbk)進行解碼便可。new String(strCn.getBytes(「ISO-8859-1」),「UTF-8」);
這種方式操做比較麻煩的是,有一個參數要用iso-8859-1編碼一次再解碼一次。
POST方式的亂碼:只須要request.setCharacterEncoding("UTF-8"):便可。