1 19 20 package com.maverick.http; 21 22 26 public class URLDecoder { 27 28 public static String decode(String s) { 29 return decode(s, true); 30 } 31 32 public static String decode(String s, boolean decodePlus) { 33 34 boolean needToChange = false; 35 StringBuffer sb = new StringBuffer (); 36 int numChars = s.length(); 37 int i = 0; 38 39 while (i < numChars) { 40 char c = s.charAt(i); 41 switch (c) { 42 case '+': 43 if (decodePlus) { 44 sb.append(' '); 45 i++; 46 needToChange = true; 47 } else { 48 sb.append(c); 49 i++; 50 } 51 break; 52 case '%': 53 54 try { 55 56 byte[] bytes = new byte[(numChars - i) / 3]; 57 int pos = 0; 58 59 while (((i + 2) < numChars) && (c == '%')) { 60 bytes[pos++] = (byte) Integer.parseInt(s.substring(i + 1, i + 3), 16); 61 i += 3; 62 if (i < numChars) 63 c = s.charAt(i); 64 } 65 66 if ((i < numChars) && (c == '%')) 67 throw new IllegalArgumentException (Messages.getString("URLDecoder.incompleteTrailingEscape")); 69 sb.append(new String (bytes, 0, pos)); 70 } catch (NumberFormatException e) { 71 throw new IllegalArgumentException (Messages.getString("URLDecoder.illegalHexCharacter") + e.getMessage()); 73 } 74 needToChange = true; 75 break; 76 default: 77 sb.append(c); 78 i++; 79 break; 80 } 81 } 82 83 return (needToChange ? sb.toString() : s); 84 } 85 86 } 87 | Popular Tags |