是jsp文件自己的編碼,java
第一階段是jsp編譯成.java,它會根據pageEncoding的設定讀取jsp,(jsp文件的編碼,pageEncoding是否一致),結果是由指定的編碼方案翻譯成統一的UTF-8 JAVA源碼(即.java),若是pageEncoding設定錯了,或沒有設定(在JSP標準的語法中,若是pageEncoding屬性存在,那麼JSP頁面的字符編碼方式就由pageEncoding決定,不然就由contentType屬性中的charset決定,若是charset也不存在,JSP頁面的字符編碼方式就採用默認的ISO-8859-1。),出來的就是中文亂碼。該參數還有一個功能,就是在JSP中不指定contentType參數,也不使用response.setCharacterEncoding方法時,指定對服務器響應進行從新編碼的編碼。jquery
contentType的charset是指服務器發送給客戶端時的內容編碼程序員
注:ajax
可見,pageEncoding和contentType均可以設置JSP源文件和響應正文中的字符集編碼。但也有區別:
設置JSP源文件字符集時,優先級爲pageEncoding>contentType。若是都沒有設置,默認ISO-8859-1。
設置響應輸出的字符集時,優先級爲contentType>pageEncoding。若是都沒有設置,默認ISO-8859-1。瀏覽器
1. 在IE中輸入網址http://www.baidu.com/s?wd=春節服務器
查詢字符串的編碼:app
IE:用的是操做系統的編碼。jsp
Chrome:UTF-8函數
FIREFOX:UTF-8編碼
2. 在頁面連接中:<a href=」 http://www.baidu.com/s?wd=春節」>點我</a>
由網頁編碼決定,都是由Content-Type指定
由網頁編碼決定,都是由Content-Type指定
由網頁編碼決定,都是由Content-Type指定
在發送請求時,ajax會自動把查詢字符串進行UTF-8編碼。
$.ajax({
data:[{key=value}]//這樣纔會自動編碼,若是是key=value&。。。本身拼裝的則不會編碼
});
注:jquery內部會調用jQuery.param方法對參數encode(執行本應瀏覽器處理的encode)。
編碼處理
對於GET方式處理編碼有兩種方法:(服務器爲:Tomcat)
1. 代碼實現,使用硬編碼:
new String(request.getParameter(「name」).getBytes(「iso-8859-1」),」客戶端編碼方式」);
2. 服務器下的配置(也就是把硬編碼的操做交給了Tomcat了)
在server.xml下配置:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding='UTF-8'/>
或者:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI='TRUE'/>
Ø URIEncoding是對全部GET方式的請求的數據進行統一的從新編碼。
Ø useBodyEncodingForURI則是根據響應該請求的頁面的request.setCharacterEncoding參數對數據進行的從新編碼,不一樣的頁面能夠有不一樣的從新編碼的編碼, ,在默認狀況下,該參數爲false。
request.setCharacterEncoding(arg0); 只針對POST起做用
不能直接用於URL編碼,它的真正做用是返回一個字符的Unicode編碼值。好比"春節"的返回結果是%u6625%u8282,也就是說在Unicode字符集中,"春"是第6625個(十六進制)字符,"節"是第8282個(十六進制)字符。
它的規則是,escape不編碼字符有69個:*,+,-,.,/,@,_,0-9,a-z,A-Z,對其餘全部字符進行編碼。在\u0000到\u00ff之間的符號被轉成%xx的形式,其他符號被轉成%uxxxx的形式。對應的解碼函數是unescape()。
注:首先,不管網頁的原始編碼是什麼,一旦被Javascript編碼,就都變爲unicode字符。也就是說,Javascipt函數的輸入和輸出,默認都是Unicode字符。
其次,escape()不對"+"編碼。可是咱們知道,網頁在提交表單的時候,若是有空格,則會被轉化爲+字符。服務器處理數據的時候,會把+號處理成空格。因此,使用的時候要當心。
encodeURI()是Javascript中真正用來對URL編碼的函數。
編碼後,它輸出符號的utf-8形式,而且在每一個字節前加上%。
它對應的解碼函數是decodeURI()。
須要注意的是,它不對單引號'編碼。
encodeURI不編碼字符有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
與encodeURI()的區別是,它用於對URL的組成部分進行個別編碼,而不用於對整個URL進行編碼。
encodeURIComponent不編碼字符有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z它對應的解碼函數是decodeURIComponent()。
由於第一次編碼,你的參數內容便不帶有多字節字符了,成了純粹的 Ascii 字符串。(這裏把編第一次的結果叫成 [STR_ENC1] 好了。[STR_ENC1] 是不帶有多字節字符的)
再編一次後,提交,接收時容器自動解一次(容器自動解的這一次,無論是按 GBK 仍是 UTF-8 仍是 ISO-8859-1 都好,都可以正確的獲得 [STR_ENC1])
而後,再在程序中實現一次 decodeURIComponent (Java中一般使用 java.net.URLDecoder(***, "UTF-8")) 就能夠獲得想提交的參數的原值。
舉個栗子:
String str1 = URLEncoder.encode("程序員","utf-8");//假設爲瀏覽器的第一次編碼
String str2 = URLEncoder.encode(str1,"utf-8"); //瀏覽器第二次編碼
String deStr1 = URLDecoder.decode(str2,"gbk");
//服務器進行解碼,不管是什麼編碼都能獲得正確的瀏覽器第一次的編碼
String deStr2 = URLDecoder.decode(deStr1,"utf-8");//最後獲得正確的字符串