Java Web開發總結(三) —— request接收表單提交中文參數亂碼問題
1、以POST方式提交表單中文參數的亂碼問題
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>request接收中文參數亂碼問題</title> </head> <body> <form action="<%=request.getContextPath()%>/servlet/RequestDemo04" method="post"> 用戶名:<input type="text" name="userName"/> <input type="submit" value="post方式提交表單"> </form> </body> </html>
之所以會產生亂碼,就是因為服務器和客戶端溝通的編碼不一致造成的,因此解決的辦法是:在客戶端和服務器之間設置一個統一的編碼,之後就按照此編碼進行數據的傳輸和接收。
由於客戶端是以UTF-8字符編碼將表單數據傳輸到服務器端的,因此服務器也需要設置以UTF-8字符編碼進行接收,要想完成此操作,服務器可以直接使用從ServletRequest接口繼承而來的"setCharacterEncoding(charset)"方法進行統一的編碼設置。修改後的代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 客戶端是以UTF-8編碼傳輸數據到服務器端的,所以需要設置服務器端以UTF-8的編碼進行接收,否則對於中文數據就會產生亂碼 */ request.setCharacterEncoding("UTF-8"); String userName = request.getParameter("userName"); System.out.println("userName:"+userName); }
使用request.setCharacterEncoding("UTF-8");設置服務器以UTF-8的編碼接收數據後,此時就不會產生中文亂碼問題了。
2、以GET方式提交表單中文參數的亂碼問題
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>request接收中文參數亂碼問題</title> </head> <body> <form action="${pageContext.request.contextPath}/servlet/RequestDemo04" method="get"> 姓名:<input type="text" name="name"/> <input type="submit" value="get方式提交表單"> </form> </body> </html>
對於以get方式傳輸的中文數據,通過request.setCharacterEncoding("UTF-8");這種方式是解決不了中文亂碼問題。
對於以get方式傳輸的數據,request即使設置了以指定的編碼接收數據也是無效的(至於為什麽無效我也沒有弄明白),默認的還是使用ISO8859-1這個字符編碼來接收數據,客戶端以UTF-8的編碼傳輸數據到服務器端,而服務器端的request對象使用的是ISO8859-1這個字符編碼來接收數據,服務器和客戶端溝通的編碼不一致因此才會產生中文亂碼的。解決辦法:在接收到數據後,先獲取request對象以ISO8859-1字符編碼接收到的原始數據的字節數組,然後通過字節數組以指定的編碼構建字符串,解決亂碼問題。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * * 對於以get方式傳輸的數據,request即使設置了以指定的編碼接收數據也是無效的,默認的還是使用ISO8859-1這個字符編碼來接收數據 */ String name = request.getParameter("name");//接收數據 name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//獲取request對象以ISO8859-1字符編碼接收到的原始數據的字節數組,然後通過字節數組以指定的編碼構建字符串,解決亂碼問題 System.out.println("name:"+name); }
3、以超鏈接形式傳遞中文參數的亂碼問題
客戶端想傳輸數據到服務器,可以通過表單提交的形式,也可以通過超鏈接後面加參數的形式,例如:
<a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=徐達沛">點擊</a>
點擊超鏈接,數據是以get的方式傳輸到服務器的,所以接收中文數據時也會產生中文亂碼問題,而解決中文亂碼問題的方式與上述的以get方式提交表單中文數據亂碼處理問題的方式一致。
String name = request.getParameter("name"); name =new String(name.getBytes("ISO8859-1"), "UTF-8");
另外,需要提的一點就是URL地址後面如果跟了中文數據,那麽中文參數最好使用URL編碼進行處理,如下所示:
<a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=<%=URLEncoder.encode("徐達沛", "UTF-8")%>">點擊</a>
4、提交中文數據亂碼問題總結
1、如果提交方式為post,想不亂碼,只需要在服務器端設置request對象的編碼即可,客戶端以哪種編碼提交的,服務器端的request對象就以對應的編碼接收,比如客戶端是以UTF-8編碼提交的,那麽服務器端request對象就以UTF-8編碼接收(request.setCharacterEncoding("UTF-8"))
2、如果提交方式為get,設置request對象的編碼是無效的,request對象還是以默認的ISO8859-1編碼接收數據,因此要想不亂碼,只能在接收到數據後再手工轉換,步驟如下:
1).獲取獲取客戶端提交上來的數據,得到的是亂碼字符串,data="???è?????"
String data = request.getParameter("paramName");
2).查找ISO8859-1碼表,得到客戶機提交的原始數據的字節數組
byte[] source = data.getBytes("ISO8859-1");
3).通過字節數組以指定的編碼構建字符串,解決亂碼
data = new String(source, "UTF-8");
通過字節數組以指定的編碼構建字符串,這裏指定的編碼是根據客戶端那邊提交數據時使用的字符編碼來定的,如果是GB2312,那麽就設置成data = new String(source, "GB2312"),如果是UTF-8,那麽就設置成data = new String(source, "UTF-8")
Java Web開發總結(三) —— request接收表單提交中文參數亂碼問題