1 | url : '../../admin/PCarType_getCarTypeInfo2.action?departId=' +id+ '&departName=' +escape(escape(depart_name)) |
上面是js中使用ajax请求来传递一个参数的示例,其中departName是中文。escape是js的一个转义编码函数。该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
那么我们怎么在java的action中来翻译这些编码呢:如下
001 | public class Escape { |
002 | private final static String[] hex = { |
003 | "00" , "01" , "02" , "03" , "04" , "05" , "06" , "07" , "08" , "09" , "0A" , "0B" , "0C" , "0D" , "0E" , "0F" , |
004 | "10" , "11" , "12" , "13" , "14" , "15" , "16" , "17" , "18" , "19" , "1A" , "1B" , "1C" , "1D" , "1E" , "1F" , |
005 | "20" , "21" , "22" , "23" , "24" , "25" , "26" , "27" , "28" , "29" , "2A" , "2B" , "2C" , "2D" , "2E" , "2F" , |
006 | "30" , "31" , "32" , "33" , "34" , "35" , "36" , "37" , "38" , "39" , "3A" , "3B" , "3C" , "3D" , "3E" , "3F" , |
007 | "40" , "41" , "42" , "43" , "44" , "45" , "46" , "47" , "48" , "49" , "4A" , "4B" , "4C" , "4D" , "4E" , "4F" , |
008 | "50" , "51" , "52" , "53" , "54" , "55" , "56" , "57" , "58" , "59" , "5A" , "5B" , "5C" , "5D" , "5E" , "5F" , |
009 | "60" , "61" , "62" , "63" , "64" , "65" , "66" , "67" , "68" , "69" , "6A" , "6B" , "6C" , "6D" , "6E" , "6F" , |
010 | "70" , "71" , "72" , "73" , "74" , "75" , "76" , "77" , "78" , "79" , "7A" , "7B" , "7C" , "7D" , "7E" , "7F" , |
011 | "80" , "81" , "82" , "83" , "84" , "85" , "86" , "87" , "88" , "89" , "8A" , "8B" , "8C" , "8D" , "8E" , "8F" , |
012 | "90" , "91" , "92" , "93" , "94" , "95" , "96" , "97" , "98" , "99" , "9A" , "9B" , "9C" , "9D" , "9E" , "9F" , |
013 | "A0" , "A1" , "A2" , "A3" , "A4" , "A5" , "A6" , "A7" , "A8" , "A9" , "AA" , "AB" , "AC" , "AD" , "AE" , "AF" , |
014 | "B0" , "B1" , "B2" , "B3" , "B4" , "B5" , "B6" , "B7" , "B8" , "B9" , "BA" , "BB" , "BC" , "BD" , "BE" , "BF" , |
015 | "C0" , "C1" , "C2" , "C3" , "C4" , "C5" , "C6" , "C7" , "C8" , "C9" , "CA" , "CB" , "CC" , "CD" , "CE" , "CF" , |
016 | "D0" , "D1" , "D2" , "D3" , "D4" , "D5" , "D6" , "D7" , "D8" , "D9" , "DA" , "DB" , "DC" , "DD" , "DE" , "DF" , |
017 | "E0" , "E1" , "E2" , "E3" , "E4" , "E5" , "E6" , "E7" , "E8" , "E9" , "EA" , "EB" , "EC" , "ED" , "EE" , "EF" , |
018 | "F0" , "F1" , "F2" , "F3" , "F4" , "F5" , "F6" , "F7" , "F8" , "F9" , "FA" , "FB" , "FC" , "FD" , "FE" , "FF" |
019 | }; |
020 | private final static byte [] val = { |
021 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
022 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
023 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
024 | 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 , 0x09 , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
025 | 0x3F , 0x0A , 0x0B , 0x0C , 0x0D , 0x0E , 0x0F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
026 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
027 | 0x3F , 0x0A , 0x0B , 0x0C , 0x0D , 0x0E , 0x0F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
028 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
029 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
030 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
031 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
032 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
033 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
034 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
035 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , |
036 | 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F , 0x3F |
037 | }; |
038 | public static String escape(String s) { |
039 | StringBuffer sbuf = new StringBuffer(); |
040 | int len = s.length(); |
041 | for ( int i = 0 ; i < len; i++) { |
042 | int ch = s.charAt(i); |
043 | if (ch == ' ' ) { // space : map to '+' |
044 | sbuf.append( '+' ); |
045 | } else if ( 'A' <= ch && ch <= 'Z' ) { // 'A'..'Z' : as it was |
046 | sbuf.append(( char )ch); |
047 | } else if ( 'a' <= ch && ch <= 'z' ) { // 'a'..'z' : as it was |
048 | sbuf.append(( char )ch); |
049 | } else if ( '0' <= ch && ch <= '9' ) { // '0'..'9' : as it was |
050 | sbuf.append(( char )ch); |
051 | } else if (ch == '-' || ch == '_' // unreserved : as it was |
052 | || ch == '.' || ch == '!' |
053 | || ch == '~' || ch == '*' |
054 | || ch == '\'' || ch == '(' |
055 | || ch == ')' ) { |
056 | sbuf.append(( char )ch); |
057 | } else if (ch <= 0x007F ) { // other ASCII : map to %XX |
058 | sbuf.append( '%' ); |
059 | sbuf.append(hex[ch]); |
060 | } else { // unicode : map to %uXXXX |
061 | sbuf.append( '%' ); |
062 | sbuf.append( 'u' ); |
063 | sbuf.append(hex[(ch >>> 8 )]); |
064 | sbuf.append(hex[( 0x00FF & ch)]); |
065 | } |
066 | } |
067 | return sbuf.toString(); |
068 | } |
069 | public static String unescape(String s) { |
070 | StringBuffer sbuf = new StringBuffer(); |
071 | int i = 0 ; |
072 | int len = s.length(); |
073 | while (i < len) { |
074 | int ch = s.charAt(i); |
075 | if (ch == '+' ) { // + : map to ' ' |
076 | sbuf.append( ' ' ); |
077 | } else if ( 'A' <= ch && ch <= 'Z' ) { // 'A'..'Z' : as it was |
078 | sbuf.append(( char )ch); |
079 | } else if ( 'a' <= ch && ch <= 'z' ) { // 'a'..'z' : as it was |
080 | sbuf.append(( char )ch); |
081 | } else if ( '0' <= ch && ch <= '9' ) { // '0'..'9' : as it was |
082 | sbuf.append(( char )ch); |
083 | } else if (ch == '-' || ch == '_' // unreserved : as it was |
084 | || ch == '.' || ch == '!' |
085 | || ch == '~' || ch == '*' |
086 | || ch == '\'' || ch == '(' |
087 | || ch == ')' ) { |
088 | sbuf.append(( char )ch); |
089 | } else if (ch == '%' ) { |
090 | int cint = 0 ; |
091 | if ( 'u' != s.charAt(i+ 1 )) { // %XX : map to ascii(XX) |
092 | cint = (cint << 4 ) | val[s.charAt(i+ 1 )]; |
093 | cint = (cint << 4 ) | val[s.charAt(i+ 2 )]; |
094 | i+= 2 ; |
095 | } else { // %uXXXX : map to unicode(XXXX) |
096 | cint = (cint << 4 ) | val[s.charAt(i+ 2 )]; |
097 | cint = (cint << 4 ) | val[s.charAt(i+ 3 )]; |
098 | cint = (cint << 4 ) | val[s.charAt(i+ 4 )]; |
099 | cint = (cint << 4 ) | val[s.charAt(i+ 5 )]; |
100 | i+= 5 ; |
101 | } |
102 | sbuf.append(( char )cint); |
103 | } |
104 | i++; |
105 | } |
106 | return sbuf.toString(); |
107 | } |
108 | // public static void main(String[] args) { |
109 | // String stest = "中文1234 abcd[]()<+>,.~\\"; |
110 | // System.out.println(stest); |
111 | // System.out.println(escape(stest)); |
112 | // System.out.println(unescape(escape(stest))); |
113 | // } |
114 | } |
这是我们要用到的类,把添加到项目中。
1 | String departName=Escape.unescape(request.getParameter( "departName" )).trim(); |