本章节将介绍 Apache Commons 库中的 URLCodec 类,使用该类实现 “www-form-urlencoded” 编码方案,也被误称为 URL 编码。
该编解码器旨在替代旧 Java 平台上的标准 Java 类 URLEncoder 和 URLDecoder,因为 1.4 以下 Java 版本中的这些类依赖于平台的默认字符集编码。从 1.11 版本开始,此类是线程安全的。
URLCodec() 默认构造器,默认字符编码为 CharEncoding.UTF_8
URLCodec(String charset) 构造函数,允许选择默认字符集。
String getDefaultCharset()
获取字符串解码和编码的默认字符集。实例:
import org.apache.commons.codec.net.URLCodec; public class UrlCodeDemo1 { public static void main(String[] args) { URLCodec code = new URLCodec(); System.out.println(code.getDefaultCharset()); // UTF-8 code = new URLCodec("GBK"); System.out.println(code.getDefaultCharset()); // GBK } }
byte[] encode(byte[] bytes)
将字节数组编码为 URL 安全 7 位字符数组,不安全字符被转义。
Object encode(Object obj)
将对象编码为其URL安全形式。不安全字符被转义。
String encode(String str)
使用默认字符串字符集将字符串编码为 URL 安全形式,不安全字符被转义。
String encode(String str, String charsetName)
使用指定的字符串字符集将字符串编码为 URL 安全形式,不安全字符被转义。
实例:使用上面介绍的4个 encode() 方法对 URL 进行编码,如下:
import org.apache.commons.codec.net.URLCodec; public class UrlCodeDemo2 { public static void main(String[] args) throws Exception { URLCodec code = new URLCodec(); String url = "https://www.hxstrive.com/index?_t=2021-2-4 12:54:09"; // 调用 byte[] encode(byte[] bytes) System.out.println(new String(code.encode(url.getBytes()))); // 调用 String encode(String str) 方法 System.out.println(code.encode(url)); // 调用 Object encode(Object obj) System.out.println(code.encode((Object)url)); // 调用 String encode(String str, String charsetName) System.out.println(code.encode(url, "GBK")); } }
输出结果:
https%3A%2F%2Fwww.hxstrive.com%2Findex%3F_t%3D2021-2-4+12%3A54%3A09 https%3A%2F%2Fwww.hxstrive.com%2Findex%3F_t%3D2021-2-4+12%3A54%3A09 https%3A%2F%2Fwww.hxstrive.com%2Findex%3F_t%3D2021-2-4+12%3A54%3A09 https%3A%2F%2Fwww.hxstrive.com%2Findex%3F_t%3D2021-2-4+12%3A54%3A09
byte[] decode(byte[] bytes)
将 URL 安全 7 位字符数组解码为原始字节数组,转义字符被转换回原来的表示形式。
Object decode(Object obj)
将 URL 安全对象解码为其原始形式,转义字符被转换回原来的表示形式。
String decode(String str)
使用默认字符串字符集将 URL 安全字符串解码为其原始形式。转义字符被转换回原来的表示形式。
String decode(String str, String charsetName)
使用指定的编码将 URL 安全字符串解码为其原始形式,转义字符被转换回原来的表示形式。
实例:将已经编码后的 URL 字符串解码还原成原始字符串,如下:
import org.apache.commons.codec.net.URLCodec; public class UrlCodeDemo3 { public static void main(String[] args) throws Exception { URLCodec code = new URLCodec(); String url = "https%3A%2F%2Fwww.hxstrive.com%2Findex%3F_t%3D2021-2-4+12%3A54%3A09"; // 调用 byte[] decode(byte[] bytes) System.out.println(new String(code.decode(url.getBytes()))); // 调用 String decode(String str) 方法 System.out.println(code.decode(url)); // 调用 Object decode(Object obj) System.out.println(code.decode((Object)url)); // 调用 String decode(String str, String charsetName) System.out.println(code.decode(url, "GBK")); } }
输出结果:
https://www.hxstrive.com/index?_t=2021-2-4 12:54:09 https://www.hxstrive.com/index?_t=2021-2-4 12:54:09 https://www.hxstrive.com/index?_t=2021-2-4 12:54:09 https://www.hxstrive.com/index?_t=2021-2-4 12:54:09
static byte[] encodeUrl(BitSet urlsafe, byte[] bytes)
将字节数组编码为URL安全7位字符数组.不安全字符被转义。
static byte[] decodeUrl(byte[] bytes)
将URL安全7位字符数组解码为原始字节数组.转义字符被转换回原来的表示形式。
参数说明:
urlsafe - BitSet 类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。
bytes - 原始字符串字节数组,或编码后字符串字节数组。
实例:使用 BitSet 自定义安全 URL 中的字符集合,如下:
import org.apache.commons.codec.net.URLCodec; import java.util.BitSet; public class UrlCodeDemo4 { public static void main(String[] args) throws Exception { // 创建自己的 BitSet,在 BitSet 中的字符将不会编码,即转换成 %3F 样式的表示 BitSet myBitSet = new BitSet(256); // 26个字母大小写 for (int i = 'a'; i <= 'z'; i++) { myBitSet.set(i); } for (int i = 'A'; i <= 'Z'; i++) { myBitSet.set(i); } // 指定数字 for (int i = '0'; i <= '9'; i++) { myBitSet.set(i); } // 特殊符号 myBitSet.set('-'); myBitSet.set('_'); myBitSet.set('.'); myBitSet.set('*'); myBitSet.set(' '); // 空格将被替换成 “+” 字符 myBitSet.set(':'); // 自定义 “:” 字符为安全字符(不会转义) myBitSet.set('/'); // 自定义 “/” 字符为安全字符(不会转义) String url = "https://www.hxstrive.com/index?_t=2021-2-4 12:54:09"; // 编码 byte[] result = URLCodec.encodeUrl(myBitSet, url.getBytes()); System.out.println(new String(result)); // 解码 byte[] source = URLCodec.decodeUrl(result); System.out.println(new String(source)); } }
输出结果:
https://www.hxstrive.com/index%3F_t%3D2021-2-4+12:54:09 https://www.hxstrive.com/index?_t=2021-2-4 12:54:09
其中,从上面结果得知 %3F 为 “?”,%3D 为 “=”。