URL编码和Base64编码

870 阅读2分钟

这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

数据操作过程中,经常涉及到编码与解码等相关操作,如web请求时会对url进行编码,其中的中文等字符会转义为其他内容;中文字符串数据传输时,会将其使用base64编码并在接收后解码,以避免乱码的出现。

1. URL编码

1.1 URLEncoder和URLDecoder

URLDecoder 和 URLEncoder 用于普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换。

当URL地址里包含非西欧字符的字符串时,浏览器会将这些非西欧字符串转换成application/x-www-form-urlencoded MIME 字符串。

  • URLDecoder类包含一个decode(String s,String enc)静态方法,它可以将application/x-www-form-urlencoded MIME字符串转成普通字符串;
  • URLEncoder类包含一个encode(String s,String enc)静态方法,它可以将普通字符串转换成application/x-www-form-urlencoded MIME字符串。

1.2 URL编码规则

对 String 编码时,使用以下规则:

  • 字母、数字和字符, “a” 到 “z”、”A” 到 “Z” 和 “0” 到 “9” 保持不变;
  • 特殊字符 “.”、”-“、”*” 和 “_” 保持不变;
  • 空格字符 ” ” 转换为一个加号 “+”。
  • url编码时会将+编码成空格
  • 除此之外,所有的其他字符都是不安全的,会变成以%开头的字符
  • 对于一个中文,会使用3个字节表示 由于以上限制内容,因此URL编码是一种限制性编码方式。
URLEncoder.encode(orignUrl, "UTF-8");
URLEncoder.encode(url, "UTF-8");

2. Base64编码

2.1 Base64编码规则

Base64是一种将二进制数据用文本表示的编码算法,它只包含64个字符,A-Z,a-z,0-9,+,/,对应索引为0-63。

  • base64编码时选取3个字节为一组,进行重新编排,将原来8个bit为一个字节改为每6个bit作为新的字节,3个字节编码形成4个字节
  • 如果字符字节长度不是3的倍数,会使用\x00字节补足,再根据补足的数量添加等量的=标识
  • 43yW56CB5rWL6K+HUQ==代表,编码时补足两个\x00,编码后增加两个+

2.2 Base64编码使用

如果需要将包含中文的utf-8编码字符转换称ASCII码,则需要使用Base64作为中间编码来保证字符数据的稳定。

  • 编码,要将utl-8字符使用base64编码,得到结果后将字符转成ASCII编码
  • 解码,将ASCII编码解析为Base64字符串,使用Base64解码方法解析为utf-8的结果数据
  • 除了针对字符串外,Base64还可以对不太大的文件进行编码,使用字符序列表示二进制文件
String base64Str = Base64.encodeToString(str.getBytes(), Base64.NO_PADDING);
String originStr = new String(Base64.decode(stringBase64, Base64.DEFAULT));