一:form在前臺以post方式提交數據:html
瀏覽器將數據(假設爲「中國」)發送給服務器的時候,將數據變成0101的二進制數據(假設爲98 99)時必然要查碼錶,瀏覽器以哪一個碼錶打開網頁,瀏覽器就以哪一個碼錶提交數據。數據到達服務器後,數據(98 99)要封裝到request中,在servlet中調用Request的getParameter方法返回的是字符串(「中國」),方法內部拿到數字後要轉成字符,必定要查碼錶,因爲request的設計者是外國人,因此默認查的是他們經常使用的ISO8859-1,這就是請求數據產生亂碼的根源。java
package com.yyz.request; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //以post方式提交表單 public class RequestDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //請求數據的中文亂碼問題 request.setCharacterEncoding("UTF-8");//客戶端網頁咱們控制爲UTF-8 String username = request.getParameter("username"); //獲取數據正常,輸出數據時能夠查閱不一樣碼錶 response.setCharacterEncoding("gb2312");//通知服務器發送數據時查閱的碼錶 response.setContentType("text/html;charset=gb2312");//通知瀏覽器以何種碼錶打開 PrintWriter out = response.getWriter(); out.write(username); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
二:form在前臺以get方式提交數據: 瀏覽器
get方式提交的數據依然是瀏覽器用什麼碼錶打開就用什麼碼錶發送。不一樣的是,以get方式提交數據時,request設置編碼無效。即便設置了UTF-8仍是會去查ISO8859-1。獲得(? ?),要解決這個問題,須要拿着(??)反向查ISO8859-1,拿到(98 99)後,再去查正確碼錶。服務器
1 package com.yyz.request; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 //以get方式提交表單 11 public class RequestDemo extends HttpServlet { 12 13 public void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 //請求數據的中文亂碼問題 16 request.setCharacterEncoding("UTF-8");//以get方式提交數據時,request設置編碼無效。即便設置了UTF-8仍是會去查ISO8859-1 17 String username = request.getParameter("username"); 18 System.out.println(username); 19 byte source [] = username.getBytes("iso8859-1"); 20 username = new String (source,"UTF-8"); 21 System.out.println(username); 22 23 } 24 25 public void doPost(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 doGet(request,response); 28 } 29 30 }
三:提交數據中文亂碼問題總結:post
1.若是提交方式爲post,想不亂碼,只須要設置request對象的編碼便可。編碼
注意:客戶機數據是以哪一種方式提交的,request就應該設成什麼編碼。spa
2.若是提交方式爲get,設置request對象的編碼是無效的,想不亂碼,只能手工轉換。設計
String data = "???????";//亂碼字符串
byte source [] = data.getBytes("iso8859-1");//獲得客戶機提交的原始數據
data = new String (data.getBytes("iso8859-1"),"UTF-8");//解決亂碼code
//等同於orm
data = new String (source,"UTF-8");
3.get方式的亂碼,還能夠經過更改服務器配置的方式實現。更改Tomact的conf目錄下的server.xml文件。
3.1 這種方式並不推薦,由於更改了服務器且並不靈活。
3.2這麼設置後,request的setCharacterEncoding設置什麼編碼,鏈接器就用什麼編碼,雖然比上一種更改靈活,但依然會致使咱們的應用程序緊緊依賴於服務器,也不被推薦。
四:最後的最後,提一個小細節:URL地址後面若是跟了中文數據,必定要通過URL編碼。表單提交的參數有中文數據,瀏覽器會自動幫咱們編碼,但若是是經過連接直接帶中文參數,瀏覽器是不會幫咱們編碼的,這時想經過上述第二種方式解決中文亂碼問題就時靈時不靈了,應該經過URLEncoding.encode(,"UTF-8")先編碼。