Mega Code Archive

 
Categories / Android / Network
 

URL Encode Utils

//package weibo4android.util; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.BitSet; /**  * @author yuanming  *   */ public class URLEncodeUtils {   static BitSet dontNeedEncoding;   static {     /*      * The list of characters that are not encoded has been determined as      * follows:      *       * RFC 2396 states: ----- Data characters that are allowed in a URI but      * do not have a reserved purpose are called unreserved. These include      * upper and lower case letters, decimal digits, and a limited set of      * punctuation marks and symbols.      *       * unreserved = alphanum | mark      *       * mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"      *       * Unreserved characters can be escaped without changing the semantics      * of the URI, but this should not be done unless the URI is being used      * in a context that does not allow the unescaped character to appear.      * -----      *       * It appears that both Netscape and Internet Explorer escape all      * special characters from this list with the exception of "-", "_",      * ".", "*". While it is not clear why they are escaping the other      * characters, perhaps it is safest to assume that there might be      * contexts in which the others are unsafe if not escaped. Therefore, we      * will use the same list. It is also noteworthy that this is consistent      * with O'Reilly's "HTML: The Definitive Guide" (page 164).      *       * As a last note, Intenet Explorer does not encode the "@" character      * which is clearly not unreserved according to the RFC. We are being      * consistent with the RFC in this matter, as is Netscape.      */     dontNeedEncoding = new BitSet(256);     int i;     for (i = 'a'; i <= 'z'; i++) {       dontNeedEncoding.set(i);     }     for (i = 'A'; i <= 'Z'; i++) {       dontNeedEncoding.set(i);     }     for (i = '0'; i <= '9'; i++) {       dontNeedEncoding.set(i);     }     dontNeedEncoding.set(' '); /*                    * encoding a space to a + is done in the                    * encode() method                    */     dontNeedEncoding.set('-');     dontNeedEncoding.set('_');     dontNeedEncoding.set('.');     dontNeedEncoding.set('*');     dontNeedEncoding.set('+');     dontNeedEncoding.set('%');   }   /**    * ?????????urlencode?    *     * @param str    * @return    */   public static final boolean isURLEncoded(String str) {     if (str==null &&"".equals(str)) {       return false;     }     char[] chars = str.toCharArray();     boolean containsPercent = false;     for (char c : chars) {       if (Character.isWhitespace(c)) {         return false;       }       if (!dontNeedEncoding.get(c)) {         return false;       }       if(c == '%'){         containsPercent = true;       }     }     if(!containsPercent){       return false;     }     return true;   }   public static final String encodeURL(String str) {     try {       return URLEncoder.encode(str, "utf-8");     } catch (UnsupportedEncodingException e) {       throw new RuntimeException(e);     }   }   public static final String decodeURL(String str) {     try {       return URLDecoder.decode(str, "utf-8");     } catch (UnsupportedEncodingException e) {       throw new RuntimeException(e);     }   }    }