亂碼原理:
在整個Servlet訪問過程中牽扯到 瀏覽器,Tomcat,Java程序三者
瀏覽器默認編碼方式:gbk,
Tomcat默認編碼:iso-8859-1 ,
java代碼中的編碼一般常用utf-8
從Servlet傳輸數據到瀏覽器的過程是:Servlet ---> Tomcat ---> 瀏覽器 , 但是這兩個傳輸過程的方式又不相同,
解決Servlet 向瀏覽器傳輸中文亂碼(響應亂碼):
只需要把 Tomcat 和瀏覽器的編碼都改成 utf-8
在Servlet中 response.setCharacterEncoding("utf-8");這個方法只能改變 Tomcat 的編碼方式,所以不行
可以使用另一種方法:響應亂碼解決方法:
response.setContentType("text/html;charset=utf-8");
以上方法就可以同時把 Tomcat 和瀏覽器的編碼全部該掉,也就解決了響應亂碼問題
以上是解決 後臺向前臺傳輸中文亂碼 , 下面再講解 瀏覽器向後臺傳輸中文亂碼問題
--------------------------前臺向後臺傳輸中文亂碼(請求亂碼)------------------------------
其實, 瀏覽器向Servlet 傳輸出現亂碼的原理是和上面是一樣的,都是因爲 java代碼 , Tomcat , 瀏覽器三者的編碼方式不同,但是,前臺向後臺傳輸的解決辦法比較麻煩,因爲 GET 和 POST 兩種提交方式不同 , 傳輸數據的方式也不同,先講解一下兩種方式的本質不同點:
POST: 大家都知道 post 請求,在請求路徑後面的 ?和鍵值是沒有的, 是因爲post傳輸是另外專門開啓了一個數據傳輸通道,其實是一個字節傳輸流 , 在Servlet 中 通過request.getInputStream(); 就可以獲得這個字節流, 這條流也是依賴於Tomcat的所以它的編碼也是 iso-8859-1 (這點我是猜的), 所以當這條字節流接收到 '中' 時,它會根據它自己的編碼方式來獲取 '中' 的編碼 , 這時由於流本身的編碼是不支持中文的,所以還是會把 '中' 當成 '?'來獲取編碼 還是 63 , 然後把 63 通過流傳輸到 java代碼中 , 但是 java代碼 看到的就是 63, 已經不是 '中' 的正確編碼,所以出現亂碼
POST 亂碼解決方法:
request.setCharacterEncoding("utf-8");
只需要把這條傳輸流的編碼改成utf-8 , 這句可以把Tomcat和字節流的編碼都改成 utf-8
這時,字節流在獲取瀏覽器傳來的數據時就 不會出錯,傳輸到後臺字節也不會錯,後臺解析也就不會錯了
GET:大家都知道 get 方式是把傳輸的數據以 鍵=值 的方式加在請求路徑的後面 (www.baidu.com?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu)
get 方式本身傳輸還是通過 瀏覽器 ---> Tomcat ---> java代碼 這樣的過程,也就是後臺向前臺傳輸的逆過程, 但是,由於瀏覽器的編碼我們改不了,所有從瀏覽器到 Tomcat 這個過程字符已經出錯 , 但是由於這個過程傳輸的是字節, 所以字節沒有錯,我們可以通過字節把字符逆轉回來.
解決方式 :
請求傳輸過程解析:
GET 方式的亂碼解決:原理在上圖中有解釋
String username = request.getParameter("username");
username = new String(username.getBytes("iso-8859-1"),"utf-8");
到這裏亂碼的原理和解決方式都講完了,等以後學習更深入了再進行修改