標籤:
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的編碼,所以為了避免我們不需要的編碼,我們可以通過java代碼或javaspcript代碼統一進行控制。
完成了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方法進行編碼轉換,具體java代碼是:
new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“用戶端編碼方式”)
第二種:在伺服器xml代碼中改配置資訊:
如:修改tomcat的設定檔server.xml:
<Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
redirectPort="8443"URIEncoding="用戶端編碼"/>
5) 詳細剖析POST提交如何編碼以及伺服器如何解碼以及亂碼解決方案
對於POST方式,表單中的參數值對是通過request包發送給伺服器,此時瀏覽器會根據網頁的ContentType("text/html; charset=GBK")中指定的編碼進行對錶單中的資料進行編碼,然後發給伺服器。
在伺服器端的程式中我們可以通過
Request.setCharacterEncoding()設定編碼,然後通過
request.getParameter獲得正確的資料。
這裡出現亂碼可以通過Request.setCharacterEncoding()直接解決。
在Web.xml中增加如下配置(要注意的是它的位置一定要是第一個執行的過濾器):
<filter>
<filter-name>charsetFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
該過濾器要做的其實就是強製為所有請求和響應設定編碼格式:
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
原文地址:http://blog.csdn.net/lfsf802/article/details/7232834
GET和POST 編碼和亂碼