在Java中正確解碼用Javascript:escape()編碼的中文字元
做頁面開發時使用了Javascript的escape()函式進行URL編碼,如果url中有中文,結果在JSP或Servlet中用request.getParameter()時取不到引數,只返回一個空值。經過Baidu的搜尋,結合我自己的工作實際,再加上網友的一些幫助,終於找到了問題所在及解決的辦法。
本來Javascript中的escape()是將中文按ISO-8859-1字符集進行URL編碼的,那樣通過 request.getParameter()是能直接獲取到請求引數的,但後來的Javascript將escape()換成了Unicode字符集編 碼,如此一來,在JSP和Servlet中就沒法直接拿到請求引數了,而且此時的request獲得的引數值都是空值,想了好久,也測試了不少,但是還是百思不得其解。 最後藉助於網路,終於解決了此問題,我露出了燦爛的笑容☺
解決辦法:
1、首先對中文字元進行兩次escape()編碼,如要傳引數name,值為“黃修群”,則url的格式為....name=escape(escape("黃修群")),這樣一來,在request.getParameter()就能取到編碼後的引數了,但是引數去編碼的形式:如下:
%u9EC4%u4FEE%u7FA4,
獲得的頁面引數為:獲取request引數值-->%u9EC4%u4FEE%u7FA4
此時在使用java.net.URIDecoder.decode()方法,則出現解碼錯誤,錯誤資訊如下:
2010-5-19 15:28:03 org.apache.catalina.core.ApplicationDispatcher invoke
嚴重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u9"
at java.net.URLDecoder.decode(URLDecoder.java:173)
at com.mapgis.vfd.plugins.vfdwebserver.VFDWebServer.getPageParameterList(VFDWebServer.java:674)
可見是解碼出現了問題了
也許有人問,那我在客戶端非要只用一次escape方法編碼,會出現什麼樣的結果?請看下面:
2010-5-19 14:59:38 org.apache.tomcat.util.http.Parameters processParameters
警告: Parameters: Character decoding failed. Parameter skipped.
java.io.CharConversionException: isHexDigit
at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:88)
at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:49)
at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:412)
at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:394)
。。。。。
看到上面的提示資訊,可以斷定是解碼出現問題了,而獲得的請求物件去是空的,如下:
獲取request引數值-->null
2、由於取到的引數是 u9EC4%u4FEE%u7FA4格式的,沒法用常規的URLDecoder.decode()來進行解碼,還好,這世上的牛人夠多,在網上直接找到了一個工具類,能實現 Javascript中escape()及unescape()式的編解碼,原始碼如下:
程式碼執行如下:
黃修群1234 abcd[]()<+>,.~/
%u9EC4%u4FEE%u7FA41234+abcd%5B%5D()%3C%2B%3E%2C.~%5C
黃修群1234 abcd[]()<+>,.~/
黃修群
有了這個工具類,直接用Escape.unescape()方法就能將獲取到的引數解碼成中文格式了。
paraValue= Escape.unescape(request.getParameter(name).toString().trim());
結果輸出了:黃修群
幸福吧,哈哈!