URL编码

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

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号