我思故我强

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 李云泽 阅读(365) 评论(0)  编辑  收藏 所属分类: Java代码


只有注册用户登录后才能发表评论。


网站导航: