这是我参与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));