關於jsp訪問路徑帶中文值需encodeURI兩次的緣由

jsp日後臺傳值的時候,通常能夠經過路徑傳值和ajax傳值。html

其中經過ajax post傳值不會出現中文亂碼現象,但路徑傳值若是不經過特殊的編碼,後臺可能獲取到的是一串亂碼。java

encodeURI能夠幫助咱們完成中文編碼,encodeURI默認是採用utf-8進行編碼的。其中中文在utf-8的編碼格式中是由3個字節組成,每一個字節轉成16進制後會在前面添加一個%。ajax

    如 '江' 編碼一次後 -> '%E6%B1%9F'數組

可是後臺獲取數據的時候,會自動對值進行解碼,此時後臺解碼的格式多是'iso-8859',而%會被看成轉義字符,那麼解碼後就可能出現一堆亂碼了。tomcat

所以此處須要對中文進行兩次編碼,將'%'也編碼一次->'%25',這樣不論後臺是什麼解碼格式,獲得的值都將是中文utf-8編碼一次的結果。jsp

    如 '江' 編碼兩次後 -> '%25E6%25B1%259F'post

    後臺對uri路徑值 自動解碼一次 ->'%E6%B1%9F'編碼

    再經過URLDecoder.decode()方法對值進行'utf-8'格式解碼 -> '江'url

ps: ajax load()方法傳中文參數的時候,只須要encodeURI一次spa

URL 中中文轉碼

1.將字符串轉碼:newString(「xxxxx」.getBytes("iso-8859-1"),"utf-8")

這種轉碼方式有很大的弊端,由於它是使用指定的字符集將此String編碼爲byte 序列,並將結果存儲到一個新的byte 數組中,而後經過使用指定的字符編碼將生成的byte 數組解碼,構造一個新的String字符串。這種狀況就有可能遇到的狀況是,不能將一個漢字所有解碼完。這樣,前邊的都能正常顯示,可是最後一個字多是亂碼。

因此不建議使用這種方式。

2.在傳參前轉碼,接收參數後再轉碼回來。

這種方式有兩種:

第一種:

傳參前:使用java.net.URLEncoder.encode("xxxx",「utf-8"),將中文轉爲16進制字符。

接收參數後:使用java.net.URLDncoder.decode("xxxx",「utf-8")將16進制字符轉爲中文。

這種方式須要注意的是,在使用encode轉碼後,會出現特殊字符,這時候,就須要將特殊字符替換爲相應的16進制。由於特殊字符在url路徑中作爲參數傳遞時,也是亂碼。

第二種:

傳參前:encodeURI(「xxxx」)  。

接收參數後:使用java.net.URLDncoder.decode("xxxx",「utf-8")將16進制字符轉爲中文。

這種方式須要注意的是,在使用encodeURI轉碼後,會出現特殊字符,這時候,就須要將特殊字符也轉碼,因此使用兩次encodeURI,即:

encodeURI(encodeURI(「xxxx」))。

這兩種轉碼方式是很好用的,因此很建議你們使用。

3. 修改tomcat配置文件:

在Tomcat的安裝目錄下conf文件夾中的server.xml文件,將配置訪問端口的地方加上URIEncoding=「utf8"便可。  <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" URIEncoding="GBK">

 

最後介紹下字符集:

主要的字符編碼又三種 一、Default(GB23十二、GBK) 一個漢字兩個字節,一個字母一個字節,缺點就是會和其餘編碼衝突,沒有國際通用性。 二、Unicode 任何一個字符都是兩字節,具備國際通用性,但html傳輸中多數字符是字母,形成大量帶寬浪費。 三、Utf8(UCS transformation formats) 一個漢字三個字節,一個字母一個字節 這個是Unicode的升級版。 

相關文章
相關標籤/搜索