1. 程式人生 > >在Java中正確解碼用Javascript:escape()編碼的中文字元

在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());

結果輸出了:黃修群

幸福吧,哈哈!