URL编码:
URL 编码是浏览器发送数据给服务器时使用的编码,它通常附加在 URL 的参数部 分,例如: https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87。
之所以使用URL编码,是因为出于兼容性考虑,因为很多的服务器只识别 ASCII 字符,URL拥有一套自己的规则。
例如:
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class Test1 {
public static void main(String[] args) throws UnsupportedEncodingException {
String ur1 = "http://www.baidu.com/s?wd=";
String value = "中国";
//对URL中的中文进行编码
String result = URLEncoder.encode(value,"utf-8");
System.out.println(result);
System.out.println(ur1 + result);
//对URL中的中文进行解码
String param = "https://www.baidu.com/s?wd=%E6%88%91%E6%9C%AC%E5%B0%86%E5%BF%83%E5%90%91%E6%98%8E%E6%9C%88";
String content = URLDecoder.decode(param,"utf-8");
System.out.println(content);
}
}
Base64编码:
URL 编码是对字符进行编码,表示成 %xx 的形式,而 Base64 编码是对二进制数据进行编码,表示成 文本格式。
例:从文本文件中读取一张图片的Base64编码值,再用Base64解码。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.List;
public class Test2 {
public static void main(String[] args) throws IOException {
//从文本文件中读取一张图片的Base64编码值
List<String> lines = Files.readAllLines(Paths.get("D:\\pic\\周杰伦.txt"));
StringBuilder sb = new StringBuilder();
for(String ln : lines) {
sb.append(ln);
}
System.out.println(sb.length());
//Base64解码
byte[] imageResultByteArray = Base64.getDecoder().decode(sb.toString());
Files.write(Paths.get("D:\\photograph\\zhoujielun.jpg"), imageResultByteArray);
}
}
两种编码方式的对比:
import java.util.Arrays;
import java.util.Base64;
public class Test4 {
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));
}
}