亂碼

服務器JSP編碼

pageEncoding

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

contentTypecharset是指服務器發送給客戶端時的內容編碼程序員

 

注:ajax

可見,pageEncodingcontentType均可以設置JSP源文件和響應正文中的字符集編碼。但也有區別:
設置JSP源文件字符集時,優先級pageEncoding>contentType。若是都沒有設置,默認ISO-8859-1
設置響應輸出的字符集時,優先級爲contentType>pageEncoding。若是都沒有設置,默認ISO-8859-1瀏覽器

客戶端瀏覽器編碼

URL編碼    

1.       IE中輸入網址http://www.baidu.com/s?wd=春節服務器

查詢字符串的編碼:app

IE:用的是操做系統的編碼。jsp

ChromeUTF-8函數

FIREFOX:UTF-8編碼

2.       在頁面連接中:<a href=」 http://www.baidu.com/s?wd=春節」>點我</a>

由網頁編碼決定,都是由Content-Type指定

GET請求

由網頁編碼決定,都是由Content-Type指定

POST請求

由網頁編碼決定,都是由Content-Type指定

Jquery ajax請求

       在發送請求時,ajax會自動把查詢字符串進行UTF-8編碼。

$.ajax({

    data:[{key=value}]//這樣纔會自動編碼,若是是key=value&。。。本身拼裝的則不會編碼

});

注:jquery內部會調用jQuery.param方法對參數encode(執行本應瀏覽器處理的encode)。 

 

編碼處理

GET請求

對於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

POST請求

request.setCharacterEncoding(arg0);  只針對POST起做用

Javascript編碼函數

1.   escape()

不能直接用於URL編碼,它的真正做用是返回一個字符的Unicode編碼值。好比"春節"的返回結果是%u6625%u8282,也就是說在Unicode字符集中,""是第6625個(十六進制)字符,""是第8282個(十六進制)字符。

它的規則是,escape不編碼字符有69個:*+-./@_0-9a-zA-Z,對其餘全部字符進行編碼。在\u0000\u00ff之間的符號被轉成%xx的形式,其他符號被轉成%uxxxx的形式。對應的解碼函數是unescape()

注:首先,不管網頁的原始編碼是什麼,一旦被Javascript編碼,就都變爲unicode字符。也就是說,Javascipt函數的輸入和輸出,默認都是Unicode字符。
其次,escape()不對"+"編碼。可是咱們知道,網頁在提交表單的時候,若是有空格,則會被轉化爲+字符。服務器處理數據的時候,會把+號處理成空格。因此,使用的時候要當心。

 

encodeURI()

encodeURI()Javascript中真正用來對URL編碼的函數。

編碼後,它輸出符號的utf-8形式,而且在每一個字節前加上%
它對應的解碼函數是decodeURI() 
須要注意的是,它不對單引號'編碼。

encodeURI不編碼字符有82個:!#$&'()*+,-./:;=?@_~0-9a-zA-Z

encodeURIComponent()

encodeURI()的區別是,它用於對URL的組成部分進行個別編碼,而不用於對整個URL進行編碼
encodeURIComponent不編碼字符有71個:! '()*-._~0-9a-zA-Z它對應的解碼函數是decodeURIComponent()

有時爲何會使用兩次js編碼

由於第一次編碼,你的參數內容便不帶有多字節字符了,成了純粹的 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");//最後獲得正確的字符串

 



相關文章
相關標籤/搜索