javaweb中中文亂碼解決方法總結之response和request解決方法

bingguang1993發表於2018-03-16

中文論碼問題出現的由來

        之所以會產生亂碼問題,不僅僅是中文亂碼,其原因就在於:編碼和解碼採用了不同的碼錶。而之所以會有編碼和解碼這一回事,也是因為,無論資料是在傳輸還是儲存等等過程中,都是以位元組的方式在執行,所以就有了編碼問題,又因為技術發展,各國國情等等各方面的因素導致了這個世界上產生了很多種編碼方式。

二常見的編碼方式

        1ISO-8859-1拉丁編碼,供西方那幫哥們用的,裡面壓根就沒有中文編碼,所以使用了ISO-8859-1編碼,不用說,一定會亂。

        2GBK,GB2312這是中國的國標碼,目前中國境內的瀏覽器的預設編碼就是GBK;

        3UTF-8由於編碼太多了,不利於統一,就產生了2個或4個位元組的Unicode編碼,這種編碼方式支援全世界各個國家的編碼,所以編寫程式,一般就選擇UTF-8了,萬國碼嘛,沒辦法。

三response亂碼問題

        response響應物件,可以向客戶端輸出響應正文,response中提供了兩個兩個響應流,分別是字元響應流和位元組響應流。其中字元響應流只能用來輸出字元,而位元組響應流可以用來輸出任何東西。

        1字元流問題

        對於字元響應流而言,其字元響應流的預設編碼方式是ISO-8859-1,所以當我們在使用字元流來輸出中文的時候,如果不更改編碼方式,那肯定亂碼,那如何來解決中文亂碼問題呢?

        解決方案:

                a:設定response的字元流的編碼方式為UTF-8;其程式碼為:response.setCharacterEncoding("UTF-8");

                b:設定瀏覽器解碼是用UTF-8的碼錶來解碼;其程式碼為:response.setHeader("content-type", "text/html;charset=UTF-8");
        但是在設定了response.setHeader("content-type", "text/html;charset=UTF-8");其實不用書寫response.setCharacterEncoding("UTF-8");因為前面的那句程式碼不僅設定了瀏覽器的解碼方式,與此同時,也設定了伺服器的編碼方式。還有一種簡便的書寫方式為:response.setContentType("text/html;charset=UTF-8");這句程式碼也是在設定了瀏覽器的解碼方式的同時也設定了伺服器段的編碼方式,所以一般採用這種程式碼書寫方式。

        2位元組流問題

        對於位元組響應流而言,其預設的編碼方式也是ISO-8859-1,所以也會出現中文亂碼問題。

        解決方案:

                a,對字元進行編碼的時候,指定編碼方式。其程式碼為:response.getOutputStream().write("北京".getBytes("UTF-8"));

                b,同時設定瀏覽器的解碼方式。其程式碼為:response.setHeader("content-type", "text/html;charset=UTF-8");或response.setContentType("text/html;charset=UTF-8");

四request亂碼問題

        我們先來理下思路,我們向伺服器端傳送資料,但我們是怎麼發的呢?總的來說,我們有這麼兩種方式,一是自己在位址列中寫上請求地址加請求引數;二是通過點選表單或者是超連結來向伺服器傳送資料。那麼對於剛剛提到的第一種方式,我們這裡不作處理,因為我想,一般沒人這麼幹吧,如果他要真這麼幹了,讓他自己去處理吧。所以接下來,我們將會處理第二種方式的中文亂碼問題,這又可以分為get請求和post請求兩種。

        1post請求亂碼問題

                對於post請求,根據我們剛剛提到的,我們向伺服器傳送資料,是通過點選表單或者是超連結,那麼說明此時我們是在已經拿到伺服器傳送給客服端的頁面了,而這種情況下,頁面的編碼方式一般情況下已經被設定成了UTF-8,所以我們只需要設定伺服器端的解碼方式也為UTF-8即可。其程式碼為:request.setCharacterEncoding("UTF-8");

        2get請求亂碼問題

                對於get請求方式,理論上,我們也只需要告訴伺服器以UTF-8的方式解碼即可,但不幸的是,它不允許我們以編寫程式碼的方式來更改伺服器的解碼方式,只能通過修改伺服器的配置檔案,具體操作就是,在伺服器的conf目錄下的server.xml檔案中找到

[html] view plain copy

  1. <Connector port="8080" protocol="HTTP/1.1"   
  2.                connectionTimeout="20000"   
  3.                redirectPort="8443" />  

然後在裡面再新增一個屬性URIEncoding,值為UTF-8.雖然這種方式可以解決問題,但我們不會用,因為不可能我們在自己的機器寫程式碼時,把這個配置改了,然後將來把專案移交的時候,順便說下,大兄弟,回頭記得把配置改下啊。你覺得可能嗎?所以我們不採用這樣的方式。

        既然不能通過編寫程式碼的方式來更改解碼方式,那怎麼解決這個問題呢?其解決辦法就是反編碼,即,我們先對通過request.getParameter("引數");等函式得到的資料進行ISO-8859-1方式解碼,然後把得到的位元組再通過UTF-8解碼,就得到了。其程式碼為:String str = new String(request.getParameter("引數").getBytes("ISO-8859-1"), "UTF-8");

相關文章