- /**
- * 对{@link URLEncoder#encode(String, String)}的封装,但不编码'/'字符,对其他字符分段编码
- *
- * @param str
- * 要编码的URL
- * @param encoding
- * 编码格式
- * @return 字符串以字符'/'隔开,对每一段单独编码以encoding编码格式编码
- * @version: 2012_01_10
- * <p>
- * 注意:未考虑':',如直接对http://编解码,会产生错误!!!请在使用前将其分离出来,可以使用
- * {@link #encodeURLAfterHost(String, String)}方法解决此问题
- * <p>
- * 注意:对字符/一起编码,导致URL请求异常!!
- */
- public static String encodeURL(String str, String encoding) {
- final char splitter = '/';
- try {
- StringBuilder sb = new StringBuilder(2 * str.length());
- int start = 0;
- for (int i = 0; i < str.length(); i++) {
- if (str.charAt(i) == splitter) {
- sb.append(URLEncoder.encode(str.substring(start, i),
- encoding));
- sb.append(splitter);
- start = i + 1;
- }
- }
- if (start < str.length())
- sb.append(URLEncoder.encode(str.substring(start), encoding));
- return sb.toString();
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 对IP地址后的URL通过'/'分割后进行分段编码.
- * <p>
- * 对{@link URLEncoder#encode(String, String)}
- * 的封装,但不编码'/'字符,也不编码网站部分(如ftp://a.b.c.d/部分,检测方法为对三个'/'字符的检测,且要求前两个连续),
- * 对其他字符分段编码
- *
- * @param str
- * 要编码的URL
- * @param encoding
- * 编码格式
- * @return IP地址后字符串以字符'/'隔开,对每一段单独编码以encoding编码格式编码,其他部分不变
- * @version: 2012_01_10
- * <p>
- * 注意:对字符/一起编码,导致URL请求异常!!
- */
- public static String encodeURLAfterHost(String str, String encoding) {
- final char splitter = '/';
- int index = str.indexOf(splitter);//第一个'/'的位置
- index++;//移到下一位置!!
- if (index < str.length() && str.charAt(index) == splitter) {//检测第一个'/'之后是否还是'/',如ftp://
- index++;//从下一个开始
- index = str.indexOf(splitter, index);//第三个'/';如ftp://anonymous:tmp@g.cn:219.223.168.20/中的最后一个'/'
- if (index > 0) {
- return str.substring(0, index + 1)
- + encodeURL(str.substring(index + 1), encoding);//如ftp://anonymous:tmp@g.cn:219.223.168.20/天空
- } else
- return str;//如ftp://anonymous:tmp@g.cn:219.223.168.20
- }
- return encodeURL(str, encoding);
- }
- /**
- * 对IP地址后的URL通过'/'分割后进行分段编码.
- * 此方法与{@link #decodeURLAfterHost(String, String)}配对使用
- * @param str
- * 要解码的URL
- * @param encoding
- * str的编码格式
- * @return IP地址后字符串以字符'/'隔开,对每一段单独解码以encoding编码格式解码,其他部分不变
- * @version: 2012_01_10
- *
- * <p>
- * 注意:对字符/一起解码,将导致URL请求异常!!
- */
- public static String decodeURLAfterHost(String str, String encoding) {
- final char splitter = '/';
- int index = str.indexOf(splitter);//第一个'/'的位置
- index++;//移到下一位置!!
- if (index < str.length() && str.charAt(index) == splitter) {//检测第一个'/'之后是否还是'/',如ftp://
- index++;//从下一个开始
- index = str.indexOf(splitter, index);//第三个'/';如ftp://anonymous:tmp@g.cn:219.223.168.20/中的最后一个'/'
- if (index > 0) {
- return str.substring(0, index + 1)
- + decodeURL(str.substring(index + 1), encoding);//如ftp://anonymous:tmp@g.cn:219.223.168.20/天空
- } else
- return str;//如ftp://anonymous:tmp@g.cn:219.223.168.20
- }
- return decodeURL(str, encoding);
- }
- /**
- * 此方法与{@link #encodeURL(String, String)}配对使用
- * <p>
- * 对{@link URLDecoder#decode(String, String)}的封装,但不解码'/'字符,对其他字符分段解码
- *
- * @param str
- * 要解码的URL
- * @param encoding
- * str的编码格式
- * @return 字符串以字符'/'隔开,对每一段单独编码以encoding编码格式解码
- * @version: 2012_01_10
- *
- * <p>
- * 注意:对字符/一起编码,导致URL请求异常!!
- */
- public static String decodeURL(String str, String encoding) {
- final char splitter = '/';
- try {
- StringBuilder sb = new StringBuilder(str.length());
- int start = 0;
- for (int i = 0; i < str.length(); i++) {
- if (str.charAt(i) == splitter) {
- sb.append(URLDecoder.decode(str.substring(start, i),
- encoding));
- sb.append(splitter);
- start = i + 1;
- }
- }
- if (start < str.length())
- sb.append(URLDecoder.decode(str.substring(start), encoding));
- return sb.toString();
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- return null;
- }
|