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 = { 0x3F0x3F0x3F0x3F0x3F0x3F,   
  29.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  30.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  31.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  32.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x000x01,   
  33.     0x020x030x040x050x060x070x080x090x3F0x3F0x3F,   
  34.     0x3F0x3F0x3F0x3F0x0A0x0B0x0C0x0D0x0E0x0F0x3F,   
  35.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  36.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  37.     0x3F0x3F0x3F0x0A0x0B0x0C0x0D0x0E0x0F0x3F0x3F,   
  38.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  39.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  40.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  41.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  42.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  43.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  44.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  45.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  46.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  47.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  48.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  49.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  50.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F,   
  51.     0x3F0x3F0x3F0x3F0x3F0x3F0x3F0x3F };   
  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.     }    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值