在Java中正确解码用Javascript:escape()编码的中文字符

来源:互联网 发布:淘宝货品一件代发 编辑:程序博客网 时间:2024/05/01 03:11

  在做页面开发时使用了Javascript的escape()函数进行URL编码,结果在JSP或Servlet中用request.getParameter()时取不到参数,只返回一个空值。经过Baidu的搜索终于找到了问题所在及解决的办法。

        本来Javascript中的escape()是将中文按ISO-8859-1字符集进行URL编码的,那样通过 request.getParameter()是能直接获取到请求参数的,但后来的Javascript将escape()换成了Unicode字符集编 码,如此一来,在JSP和Servlet中就没法直接拿到请求参数了,具体原因我也不知道。

        解决办法:

        1、首先对中文字符进行两次escape()编码,如要传参数name,值为“你好”,则url的格式为....name=escape(escape("你好")),这样一来,在request.getParameter()就能取到编码后的参数了。

        2、由于取到的参数是  %25u4F60%25u597D  格式的,没法用常规的URLDecoder.decode()来进行解码,还好,这世上的牛人够多,在网上直接找到了一个工具类,能实现 Javascript中escape()及unescape()式的编解码,源代码如下:

 

public class Escape {    
    
private final static String[] hex = "00""01""02""03""04""05",    
    
"06""07""08""09""0A""0B""0C""0D""0E""0F""10",    
    
"11""12""13""14""15""16""17""18""19""1A""1B",    
    
"1C""1D""1E""1F""20""21""22""23""24""25""26",    
    
"27""28""29""2A""2B""2C""2D""2E""2F""30""31",    
    
"32""33""34""35""36""37""38""39""3A""3B""3C",    
    
"3D""3E""3F""40""41""42""43""44""45""46""47",    
    
"48""49""4A""4B""4C""4D""4E""4F""50""51""52",    
    
"53""54""55""56""57""58""59""5A""5B""5C""5D",    
    
"5E""5F""60""61""62""63""64""65""66""67""68",    
    
"69""6A""6B""6C""6D""6E""6F""70""71""72""73",    
    
"74""75""76""77""78""79""7A""7B""7C""7D""7E",    
    
"7F""80""81""82""83""84""85""86""87""88""89",    
    
"8A""8B""8C""8D""8E""8F""90""91""92""93""94",    
    
"95""96""97""98""99""9A""9B""9C""9D""9E""9F",    
    
"A0""A1""A2""A3""A4""A5""A6""A7""A8""A9""AA",    
    
"AB""AC""AD""AE""AF""B0""B1""B2""B3""B4""B5",    
    
"B6""B7""B8""B9""BA""BB""BC""BD""BE""BF""C0",    
    
"C1""C2""C3""C4""C5""C6""C7""C8""C9""CA""CB",    
    
"CC""CD""CE""CF""D0""D1""D2""D3""D4""D5""D6",    
    
"D7""D8""D9""DA""DB""DC""DD""DE""DF""E0""E1",    
    
"E2""E3""E4""E5""E6""E7""E8""E9""EA""EB""EC",    
    
"ED""EE""EF""F0""F1""F2""F3""F4""F5""F6""F7",    
    
"F8""F9""FA""FB""FC""FD""FE""FF" }
;    
   
    
private final static byte[] val = 0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x000x01,    
    
0x020x030x040x050x060x070x080x090x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x0A0x0B0x0C0x0D0x0E0x0F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x0A0x0B0x0C0x0D0x0E0x0F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,    
    
0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F }
;    
   
    
/**   
     * 编码 
     *    
     * 
@param s   
     * 
@return   
     
*/
   
    
public static String escape(String s) {    
    StringBuffer sbuf 
= new StringBuffer();    
    
int len = s.length();    
    
for (int i = 0; i < len; i++{    
    
int ch = s.charAt(i);    
    
if ('A' <= ch && ch <= 'Z'{    
    sbuf.append((
char) ch);    
    }
 else if ('a' <= ch && ch <= 'z'{    
    sbuf.append((
char) ch);    
    }
 else if ('0' <= ch && ch <= '9'{           
    sbuf.append((
char) ch);    
    }
 else if (ch == '-' || ch == '_'     
    
|| ch == '.' || ch == '!' || ch == '~' || ch == '*'    
    
|| ch == ''' || ch == '(' || ch == ')'{    
    sbuf.append((
char) ch);    
    }
 else if (ch <= 0x007F{    
    sbuf.append(
'%');    
    sbuf.append(hex[ch]);    
    }
 else {    
    sbuf.append(
'%');    
    sbuf.append(
'u');    
    sbuf.append(hex[(ch 
>>> 8)]);    
    sbuf.append(hex[(
0x00FF & ch)]);    
    }
    
    }
    
    
return sbuf.toString();    
    }
    
   
    
/**   
     * 解码 说明:本方法保证 不论参数s是否经过escape()编码,均能得到正确的“解码”结果 
     *    
     * 
@param s   
     * 
@return   
     
*/
   
    
public static String unescape(String s) {    
    StringBuffer sbuf 
= new StringBuffer();    
    
int i = 0;    
    
int len = s.length();    
    
while (i < len) {    
    
int ch = s.charAt(i);    
    
if ('A' <= ch && ch <= 'Z'{    
    sbuf.append((
char) ch);    
    }
 else if ('a' <= ch && ch <= 'z'{     
    sbuf.append((
char) ch);    
    }
 else if ('0' <= ch && ch <= '9'
sbuf.append((
char) ch);    
    }
 else if (ch == '-' || ch == '_'|| ch == '.' || ch == '!' || ch == '~' || ch == '*'|| ch == ''' || ch == '(' || ch == ')'{    
    sbuf.append((
char) ch);    
    }
 else if (ch == '%'{    
    
int cint = 0;    
    
if ('u' != s.charAt(i + 1)) {    
    cint 
= (cint << 4| val[s.charAt(i + 1)];    
    cint 
= (cint << 4| val[s.charAt(i + 2)];    
    i 
+= 2;    
    }
 else {    
    cint 
= (cint << 4| val[s.charAt(i + 2)];    
    cint 
= (cint << 4| val[s.charAt(i + 3)];    
    cint 
= (cint << 4| val[s.charAt(i + 4)];    
    cint 
= (cint << 4| val[s.charAt(i + 5)];    
    i 
+= 5;    
    }
    
    sbuf.append((
char) cint);    
    }
 else {    
    sbuf.append((
char) ch);    
    }
    
    i
++;    
    }
    
    
return sbuf.toString();    
    }
    
   
    
public static void main(String[] args) {    
    String stest 
= "1234 abcd[]()<+>,.~/";    
    System.out.println(stest);    
    System.out.println(escape(stest));    
    System.out.println(unescape(escape(stest)));    
    }
    
   
    }
    

 

        有了这个工具类,直接用Escape.unescape()方法就能将获取到的参数解码成中文格式了。

 
原创粉丝点击