用get請求傳中文,經常搞到亂碼,這幾天搞搞這個東西,總結一下,以方便以后處理這類的問題。
Java代碼中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多,它會將處字母和數字,以及*字符外的都編碼成%xx形式。
JS的unescape和decodeURI都不能用來解碼JAVA中URLEncoder.encode編碼的字符串。
在JAVA代碼中的URLEncoder.encode的字符串可以在JS中用decodeURIComponent還原成字符串。
在JAVA代碼中可以用URLDecoder.decode(request.getParameter("param"),"UTF-8")來將在JS中用encodeURIComponent的參數還原成字符串。
========================================================
1、decodeURI()定義和用法:
decodeURI() 函數可對 encodeURI() 函數編碼過的URI 進行解碼。
語法:decodeURI(URIstring)
參數 描述:URIstring 必需。一個字符串,含有要解碼的 URI 或其他要解碼的文本。
返回值:URIstring 的副本,其中的十六進制轉義序列將被它們表示的字符替換。
2、encodeURI 方法
將文本字符串編碼為一個有效的統一資源標識符 (URI)。
encodeURI(URIString)
必選的 URIString 參數代表一個已編碼的 URI。
說明
encodeURI 方法返回一個編碼的 URI。如果您將編碼結果傳遞給 decodeURI,那么將返回初始的字符串。encodeURI 方法不會對下列字符進行編碼:":"、
"/"、";" 和 "?"。請使用 encodeURIComponent 方法對這些字符進行編碼。
-----------------------------------------------------------------------------------------------------------
3、decodeURIComponent()定義和用法:decodeURIComponent() 函數可對 encodeURIComponent() 函數編碼的 URI 進行解碼。
語法:decodeURIComponent(URIstring)
參數 描述:URIstring 必需。一個字符串,含有編碼 URI 組件或其他要解碼的文本。
返回值:URIstring 的副本,其中的十六進制轉義序列將被它們表示的字符替換。
4、encodeURIComponent() 方法:
把URI字符串采用UTF-8編碼格式轉化成escape格式的字符串。與encodeURI()相比,這個方法將對更多的字符進行編碼,比如 / 等字符。所以如果字符串里面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字符被編碼之后URL將顯示錯誤。不會被此方法編碼的字符:! * ( )。
因此,對於中文字符串來說,如果不希望把字符串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用escape。如果你的頁面是GB2312或者其他的編碼,而接受參數的頁面是UTF-8編碼的,就要采用encodeURI或者encodeURIComponent。
========================================================
示例代碼如下:
JavaScript代碼encode
functionfindNE(){ varnd = document.getElementById("NE").value; nd = encodeURIComponent(encodeURIComponent(nd)); alert(nd); $.fn.zTree.destroy("netree"); setting.async.url="common/getNeList.action?seachName="+nd; $.fn.zTree.init($("#netree"), setting); }
java代碼decode
String serchName = request.getParameter("seachName"); System.out.println("serchName1::::::::::::::::::::::"+serchName); if(StringUtils.isNotBlank(serchName)){ try{ serchName = java.net.URLDecoder.decode(serchName,"UTF-8"); }catch (UnsupportedEncodingException e) { e.printStackTrace(); } } System.out.println("serchName2::::::::::::::::::::::"+serchName);