+ /*\r
+ * RFC 3986 section 2.2 Reserved Characters (January 2005)\r
+ * !*'();:@&=+$,/?#[]\r
+ */\r
+ private static boolean[] UNESCAPED_US_ASCII_CHARS = new boolean[128];\r
+\r
+ static {\r
+ for(char ch='A';ch <= 'Z';++ch)\r
+ UNESCAPED_US_ASCII_CHARS[ch] = true;\r
+ for(char ch='a';ch <= 'z';++ch)\r
+ UNESCAPED_US_ASCII_CHARS[ch] = true;\r
+ for(char ch='0';ch <= '9';++ch)\r
+ UNESCAPED_US_ASCII_CHARS[ch] = true;\r
+ UNESCAPED_US_ASCII_CHARS[';'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['?'] = true;\r
+ UNESCAPED_US_ASCII_CHARS[':'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['@'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['='] = true;\r
+ UNESCAPED_US_ASCII_CHARS['+'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['$'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['.'] = true;\r
+ UNESCAPED_US_ASCII_CHARS[','] = true;\r
+ UNESCAPED_US_ASCII_CHARS['-'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['_'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['!'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['~'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['*'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['\''] = true;\r
+ UNESCAPED_US_ASCII_CHARS['('] = true;\r
+ UNESCAPED_US_ASCII_CHARS[')'] = true;\r
+ UNESCAPED_US_ASCII_CHARS['['] = true;\r
+ UNESCAPED_US_ASCII_CHARS[']'] = true;\r
+ }\r
+\r
+ private static boolean needsEscaping(String unicode) {\r
+ int len = unicode.length();\r
+ for (int i = 0; i < len; ++i) {\r
+ char ch = unicode.charAt(i);\r
+ if (ch >= 128 || !UNESCAPED_US_ASCII_CHARS[ch])\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r