獲取表單數據的時候,有這句代碼request.setCharacterEncoding("UTF-8");
,如果沒有這句代碼,會發生什么事呢?
- 填寫數據
- 在服務器查看提交過來的數據,所有的中文數據都亂碼了
-
來這里我們來分析一下亂碼的原因,Tomcat服務器默認編碼是ISO 8859-1,而瀏覽器使用的是UTF-8編碼。瀏覽器的中文數據提交給服務器,**Tomcat以ISO 8859-1編碼對中文編碼,當我在Servlet讀取數據的時候,拿到的當然是亂碼。**而我設置request的編碼為UTF-8,亂碼就解決了。
-
接下來使用get方式傳遞中文數據,把表單的方式改成get即可
-
當我們訪問的時候,又出現亂碼了!
- 於是我按照上面的方式,把request對象設置編碼為UTF-8試試
request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name");
-
結果還是亂碼。這是為什么呢?我明明已經把編碼設置成UTF-8了,按照post方式,亂碼問題已經解決了!。我們來看看get和post方式的區別在哪?為什么post方式設置了request編碼就可以解決亂碼問題,而get方式不能呢。
-
首先我們來看一下post方法是怎么進行參數傳遞的。當我們點擊提交按鈕的時候,數據封裝進了Form Data中,http請求中把實體主體帶過去了【傳輸的數據稱之為實體主體】,既然request對象封裝了http請求,所以request對象可以解析到發送過來的數據,於是只要把編碼設置成UTF-8就可以解決亂碼問題了。
- 而get方式不同,它的數據是從消息行帶過去的,沒有封裝到request對象里面,所以使用request設置編碼是無效的。
- 要解決get方式亂碼問題也不難,我們既然知道Tomcat默認的編碼是ISO 8859-1,那么get方式由消息體帶過去給瀏覽器的時候肯定是用ISO 8859-1編碼了。
//此時得到的數據已經是被ISO 8859-1編碼后的字符串了,這個是亂碼 String name = request.getParameter("username"); //亂碼通過反向查ISO 8859-1得到原始的數據 byte[] bytes = name.getBytes("ISO8859-1"); //通過原始的數據,設置正確的碼表,構建字符串 String value = new String(bytes, "UTF-8");
上面的代碼有些難理解,圖說明一下:
- 經過我們手工轉換,再來訪問一下
-
好的,成功解決掉亂碼問題了。
-
除了手工轉換,get方式還可以改Tomcat服務器的配置來解決亂碼,但是不推薦使用,這樣不靈活。“
-
我們都知道Tomcat默認的編碼是ISO 8859-1,如果在Tomcat服務器的配置下改成是UTF-8的編碼,那么就解決服務器在解析數據的時候造成亂碼問題了
-
在8080端口的Connector上加入
URIEncoding="utf-8"
,設置Tomcat的訪問該端口時的編碼為utf-8,從而解決亂碼,這種改法是固定使用UTF-8編碼的
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
- 設置了編碼后,沒有做任何手工轉換,成功拿到數據
、
- 當然也有另一種改服務器編碼的方式。設置Tomcat的訪問該端口時的編碼為頁面的編碼,這種改法是隨着頁面的編碼而變
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" />
- 設置編碼為UTF-8
request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name");
- 再次訪問
-
手寫超鏈接如果附帶中文參數問題,要URL重寫,在JSP博客中會講到
-
總結:
-
post方式直接改request對象的編碼
-
get方式需要手工轉換編碼
-
get方式也可以修改Tomcat服務器的編碼,不推薦,因為會太依賴服務器了!
-
提交數據能用post就用post