Servlet 傳輸中文亂碼原理及解決方法

亂碼原理:

在整個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");




到這裏亂碼的原理和解決方式都講完了,等以後學習更深入了再進行修改



發佈了29 篇原創文章 · 獲贊 39 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章