寫在開頭:
一般說來在每個頁面的開始處,都會加入:
<%@ 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獲得正確的數據。
