我思故我强

Escape/unescape的Java实现


Escape/unescape的Java实现

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

posted on 2007-09-20 18:21 李云泽 阅读(420) 评论(0)  编辑  收藏 所属分类: Java代码