本章节将介绍 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 为 “=”。