1. 程式人生 > >表單提交亂碼

表單提交亂碼

寫在開頭:

一般說來在每個頁面的開始處,都會加入:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

contentType="text/html;charset=UTF-8"的作用是指定對伺服器響應進行重新編碼的編碼 

    pageEncoding="UTF-8" 是講jsp編譯成servlet時的編碼 ;

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


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

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

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

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

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

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

tomcat伺服器在進行解碼過程中URIEncoding就起到作用了。tomcat伺服器會根據設定的URIEncoding來進行解碼,如果沒有設定則會使用預設的ISO-8859-1來解碼。假如我們在頁面將編碼設定為UTF-8,而URIEncoding設定的不是或者沒有設定,那麼伺服器進行解碼時就會產生亂碼。這個時候我們一般可以通過new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8") 的形式來獲取正確資料。

(伺服器的編碼方式: tomcat 設定中

<Connector port="8080"protocol="HTTP/1.1"  maxThreads="150" connectionTimeout="20000"

redirectPort="8443"URIEncoding="客戶端編碼"/> 預設是iso-8859-1

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

第一種:在伺服器xml程式碼中改配置資訊:

<Connector port="8080"protocol="HTTP/1.1"  maxThreads="150" connectionTimeout="20000"

redirectPort="8443"URIEncoding="客戶端編碼"/>    ps: 將伺服器與客戶端的編碼方式統一  客戶端不同的瀏覽器 編碼方式不一樣

第二種:

設定 URLEncoder.encode("中文","UTF-8") 將要傳遞的引數utf-8 編碼 將其變為位元組碼  ,這樣不管各瀏覽器怎樣對中文引數進行處理,此時經過我們編碼後的中文對瀏覽器來說就是位元組碼,與a、b、c等字母沒有什麼區別。 只要在伺服器的用"UTF-8"解碼 就能得到正確的中文;

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

對於POST方式,它採用的編碼也是由頁面來決定的即ContentType("text/html; charset=GBK")。當我通過點選頁面的submit按鈕來提交表單時,瀏覽器首先會根據ontentType的charset編碼格式來對POST表單的引數進行編碼然後提交給伺服器,在伺服器端同樣也是用contentType中設定的字符集來進行解碼(這裡與get方式就不同了),這就是通過POST表單提交的引數一般而言都不會出現亂碼問題。當然這個字符集編碼我們是可以自己設定的:request.setCharacterEncoding(charset)設定編碼,然後通過

request.getParameter獲得正確的資料。