java 代码
  1. //转换为%E4%BD%A0形式   
  2. public static String toUtf8String(String s) {   
  3.           StringBuffer sb = new StringBuffer();   
  4.           for (int i = 0; i < s.length(); i++) {   
  5.                   char c = s.charAt(i);   
  6.                   if (c >= 0 && c <= 255) {   
  7.                           sb.append(c);   
  8.                   } else {   
  9.                           byte[] b;   
  10.                           try {   
  11.                                   b = String.valueOf(c).getBytes("utf-8");   
  12.                           } catch (Exception ex) {   
  13.                                   System.out.println(ex);   
  14.                                   b = new byte[0];   
  15.                           }   
  16.                           for (int j = 0; j < b.length; j++) {   
  17.                                   int k = b[j];   
  18.                                   if (k < 0)   
  19.                                           k += 256;   
  20.                                   sb.append("%" + Integer.toHexString(k).toUpperCase());   
  21.                           }   
  22.                   }   
  23.           }   
  24.           return sb.toString();   
  25.   }   
  26.   
  27. //将%E4%BD%A0转换为汉字   
  28.       public static String unescape(String s) {   
  29.             StringBuffer sbuf = new StringBuffer () ;   
  30.             int l  = s.length() ;   
  31.             int ch = -1 ;   
  32.             int b, sumb = 0;   
  33.             for (int i = 0, more = -1 ; i < l ; i++) {   
  34.               /* Get next byte b from URL segment s */  
  35.               switch (ch = s.charAt(i)) {   
  36.                 case '%':   
  37.                   ch = s.charAt (++i) ;   
  38.                   int hb = (Character.isDigit ((char) ch)    
  39.                             ? ch - '0'   
  40.                             : 10+Character.toLowerCase((char) ch) - 'a') & 0xF ;   
  41.                   ch = s.charAt (++i) ;   
  42.                   int lb = (Character.isDigit ((char) ch)   
  43.                             ? ch - '0'   
  44.                             : 10+Character.toLowerCase ((char) ch)-'a') & 0xF ;   
  45.                   b = (hb << 4) | lb ;   
  46.                   break ;   
  47.                 case '+':   
  48.                   b = ' ' ;   
  49.                   break ;   
  50.                 default:   
  51.                   b = ch ;   
  52.               }   
  53.               /* Decode byte b as UTF-8, sumb collects incomplete chars */  
  54.               if ((b & 0xc0) == 0x80) {                        // 10xxxxxx (continuation byte)   
  55.                 sumb = (sumb << 6) | (b & 0x3f) ;        // Add 6 bits to sumb   
  56.                 if (--more == 0) sbuf.append((char) sumb) ; // Add char to sbuf   
  57.               } else if ((b & 0x80) == 0x00) {                // 0xxxxxxx (yields 7 bits)   
  58.                 sbuf.append((char) b) ;                        // Store in sbuf   
  59.               } else if ((b & 0xe0) == 0xc0) {                // 110xxxxx (yields 5 bits)   
  60.                 sumb = b & 0x1f;   
  61.                 more = 1;                                // Expect 1 more byte   
  62.               } else if ((b & 0xf0) == 0xe0) {                // 1110xxxx (yields 4 bits)   
  63.                 sumb = b & 0x0f;   
  64.                 more = 2;                                // Expect 2 more bytes   
  65.               } else if ((b & 0xf8) == 0xf0) {                // 11110xxx (yields 3 bits)   
  66.                 sumb = b & 0x07;   
  67.                 more = 3;                                // Expect 3 more bytes   
  68.               } else if ((b & 0xfc) == 0xf8) {                // 111110xx (yields 2 bits)   
  69.                 sumb = b & 0x03;   
  70.                 more = 4;                                // Expect 4 more bytes   
  71.               } else /*if ((b & 0xfe) == 0xfc)*/ {        // 1111110x (yields 1 bit)   
  72.                 sumb = b & 0x01;   
  73.                 more = 5;                                // Expect 5 more bytes   
  74.               }   
  75.               /* We don't test if the UTF-8 encoding is well-formed */  
  76.             }   
  77.             return sbuf.toString() ;   
  78.           }   
评论
发表评论

您还没有登录,请登录后发表评论

shikonglaike
搜索本博客
最近加入圈子
存档
最新评论