编码:
ASCII编码:ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。(ASCII编码中文占两个字节,英文占一个字节)
UTF-8编码:utf-8是一种变长字节编码方式。对于某一个字符的utf-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。utf-8最多可用到6个字节。(UTF-8编码中文字占3个字节英文占一个字节)
URL编码:URL 编码是浏览器发送数据给服务器时使用的编码,它通常附加在 URL 的参数部分。
URL编码规则:
● 如果字符是 A ~ Z , a ~ z , 0 ~ 9 以及 - 、 _ 、 . 、 * ,则保持不变;
● 如果是其他字符,先转换为 UTF-8 编码,然后对每个字节以 %XX 表示
java中有一个URLEncoder类可以对任意字符串进行URL编码:
import java.net.URLEncoder;
public class Main {
public static void main(String[] args) {
String encoded = URLEncoder.encode("中文!", "utf-8");
System.out.println(encoded);
}
}
上述代码的运行结果是 %E4%B8%AD%E6%96%87%21 ,"中"的 URL 编码是 %E4%B8%AD ,"文"的URL编码是 %E6%96%87 , ! 虽然是 ASCII 字符,也要 对其编码为 %21 。
当然收到URL编码也可以解码:URLDecoder类
public class Main {
public static void main(String[] args) {
String decoded = URLDecoder.decode("%E4%B8%AD%E6%96%87%21", "utf-8");
System.out.println(decoded);
}
}
URL 编码是编码算法,不是加密算法。 URL 编码的目的是把任意文本数据编码为 % 前缀表示的文本,编码后的文本仅包含 A ~ Z , a ~ z , 0 ~ 9 , - , _ , . , * 和 % ,便于浏览器和服务器处理。
Ba'se64编码:Base64 编码的目的是把二进制数据变成文本格式,Base64 编码可以把任意长度的二进制数据变为纯文本,并且纯文本内容中且只包含指定字符内容: A ~ Z 、 a ~ z 、 0 ~ 9 、 + 、 / 、 = 。它的原理是把 3 字节的二进制数据按 6bit 一组,用 4 个int整数表示,然后查表,把 int 整数用索引对应到字符,得到编码后的字符串。、
在java中使用base64类对byte [ ] 进行编码和解码:
public class Main {
public static void main(String[] args) {
byte[] input = new byte[] { (byte) 0xe4, (byte) 0xb8, (byte) 0xad };
String b64encoded = Base64.getEncoder().encodeToString(input);
System.out.println(b64encoded);
}
}
public class Main {
public static void main(String[] args) {
byte[] output = Base64.getDecoder().decode("5Lit");
System.out.println(Arrays.toString(output)); // [-28, -72, -83]
}
}
因为标准的 Base64 编码会出现 + 、 / 和 = ,所以不适合把 Base64 编码后的字符串放到 URL 中。一种针对 URL 的 Base64 编码可以在 U RL 中使用的 Base64 编码,它仅仅是把 + 变成 - , / 变成 _ :
public class Main {
public static void main(String[] args) {
// 原始字节内容
byte[] input = new byte[] { 0x01, 0x02, 0x7f, 0x00 };
// 分别使用两种方式进行编码
String b64Encode = Base64.getEncoder().encodeToString(input);
String b64UrlEncoded = Base64.getUrlEncoder().encodeToString(input);
// 结果完全一致
System.out.println(b64Encode);
System.out.println(b64UrlEncoded);
// 分别使用两种方式进行重新解码
byte[] output1 = Base64.getDecoder().decode(b64Encode);
System.out.println(Arrays.toString(output1));
byte[] output2 = Base64.getUrlDecoder().decode(b64UrlEncoded);
System.out.println(Arrays.toString(output2));
}
}
Base64 编码的目的是把二进制数据变成文本格式,这样在很多文本中就可以处理二进制数据。例如,电子邮件协议就是文本协议, 如果要在电子邮件中添加一个二进制文件,就可以用 Base64 编码,然后以文本的形式传送。
Base64 编码的缺点是传输效率会降低,因为它把原始数据的长度增加了1/3。和 URL 编码一样, Base64 编码是一种编码算 法,不是加密算法。
如果把 Base64 的 64 个字符编码表换成 32 个、 48 个或者 58 个,就可以使用 Base32 编码, Base48 编码和 Base58 编 码。字符越少,编码的效率就会越v
小结:
- URL 编码和 Base64 编码都是编码算法,它们不是加密算法;
- URL 编码的目的是把任意文本数据编码为 % 前缀表示的文本,便于浏览器和服务器处理;
- Base64 编码的目的是把任意二进制数据编码为文本,但编码后数据量会增加 1/3 。



