GET和POST 編碼和亂碼

2022-09-05 08:03:07 字數 2387 閱讀 4497

1.  什麼是url編碼。

url編碼是一種瀏覽器用來打包表單輸入的格式,瀏覽器從表單中獲取所有的name和其對應的value,將他們以name/value編碼方式作為url的一部分或者分離的傳送到伺服器上。

2.  url編碼規則。

每對name/value由&分開,每對來自表單的name/value用=分開。如果使用者沒有輸入值的那個name依舊會出現不過就是沒有值。

url編碼是在字元ascii碼的十六進製制數的前面加上%。例如\(她的十六進製制數表示為5c)的url編碼就是%5c。

3.  簡單介紹亂碼和http請求

其實做web開發亂碼問題是經常出現的,有了上面編碼的基礎之後下面來看看亂碼。

1)  亂碼問題是web開發過程中經常遇到的問題,主要原因就是url中使用了非ascii碼造成伺服器後台程式解析出現亂碼的問題。

2)  url中最容易出現中文的地方就是在querystring的引數值還有servletpath中。

3)  簡單用乙個圖來說明一下http請求的流程:

第一步:瀏覽器把url經過編碼送給伺服器;

第二步:伺服器把這些請求解碼處理完畢之後將顯示的內容進行編碼傳送給客戶端瀏覽器;

第三步:瀏覽器按照指定的編碼顯示網頁

4)  詳細剖析get提交如何編碼以及伺服器如何解碼以及亂碼解決方案

對於get方式,我們知道它的提交是將請求資料附加到url後面作為引數,這樣依賴亂碼就會很容易出現,因為資料name和value很有可能就是傳遞的為非ascii碼。

當url拼接後,瀏覽器對其進行encode,然後傳送到伺服器。具體規則見url編碼規則。

這裡詳細說一下encode的過程中容易出現的問題,在這個過程中我們要明白需要url encode的字元一般都是非ascii碼字元,所以我們就能知道出現亂碼主要是url中附加了中文或特殊字元做成的,另乙個要知道url encode到底是以什麼樣的編碼方式對字元進行編碼的,其實這個編碼方式是由瀏覽器決定的,不同的瀏覽器和同一瀏覽器的不同設定影響了url的編碼,所以為了避免我們不需要的編碼,我們可以通過j**a**或j**aspcript**統一進行控制。

完成了url encode之後url就成了ascii範圍內的字元了,然後就以iso-8859-1的編碼方式轉換為二進位制隨著請求頭一起傳送出去。

到了伺服器之後,首先伺服器會先用iso-8859-1進行解碼,伺服器獲取的資料都是ascii範圍內的請求頭字元,其中請求url裡面帶有引數資料,如果是中衛或特殊字元,那麼encode後的%xy(編碼規則中的十六進製制數)通過request.setcharacterencoding()是不管用的。這時候我們就能發現出現亂碼的根本原因就是客戶端一般是通過用utf-8或gbk等對資料進行encode的,到了伺服器卻用iso-8859-1方式decoder顯然不行。

這裡的解決方式有兩種,

一種:是通過string類的getbytes方法進行編碼轉換,具體j**a**是:

new string(request.getparameter(「name」).getbytes(「iso-8859-1」),「客戶端編碼方式」)

第二種:在伺服器xml**中改配置資訊:

如:修改tomcat的配置檔案server.xml:

redirectport="8443"uriencoding="客戶端編碼"/>

5)  詳細剖析post提交如何編碼以及伺服器如何解碼以及亂碼解決方案

對於post方式,表單中的引數值對是通過request包傳送給伺服器,此時瀏覽器會根據網頁的contenttype("text/html; charset=gbk")中指定的編碼進行對表單中的資料進行編碼,然後發給伺服器。

在伺服器端的程式中我們可以通過

request.setcharacterencoding()設定編碼,然後通過

request.getparameter獲得正確的資料。

這裡出現亂碼可以通過request.setcharacterencoding()直接解決。

在web.xml中增加如下配置(要注意的是它的位置一定要是第乙個執行的過濾器):

charsetfilter

org.springframework.web.filter.characterencodingfilter

encoding

utf-8

forceencoding

true

該過濾器要做的其實就是強制為所有請求和響應設定編碼格式:

request.setcharacterencoding("utf-8");

response.setcharacterencoding("utf-8");

解決全站字元亂碼(POST和GET中文編碼問題)

servlet l post request.setcharacterencoding utf 8 l get string username request.getparameter username username new string username.getbytes iso 8859 1...

解決 post和get請求亂碼

在web.xml新增post亂碼filter 在web.xml中加入 filter filter name characterencodingfilter filter name filter class org.springframework.web.filter.characterencodin...

get和post 請求亂碼問題

post 在web.xml中加入 characterencodingfilter org.springframework.web.filter.characterencodingfilter encoding utf 8 get 以上可以解決post 請求亂碼問題。對於get 請求中文引數出現亂碼解...