在理清字符集和字符编码关系一文中我们介绍了常见字符集以及字符编码之间的关系,本期我们继续朝着这个方向介绍常见的编码算法。
URL编码是浏览器发送数据给服务器时使用的编码,它是编码算法,而不是加密算法,URL编码的目的是把任意文本数据编码为以%
前缀表示的文本,编码后的文本仅包含A~Z
,a~z
,0~9
以及-_.*
,这样做便于浏览器和服务器处理,比如,<
用%3C
表示。为了帮助大家理解,举一个更加具体的例子,一条完整的URL是"http://www.mukedada.com/login?username=admin&password=123456?remark=管理员"
,它的URL编码是http%3A%2F%2Fwww.mukedada.com%2Flogin%3Fusername%3Dadmin%26password%3D123456%3Fremark%3D%E7%AE%A1%E7%90%86%E5%91%98
,我们发现除了英文字母、数字之外都变成了以%
开头,由于一个中文以3个字节表示,所以管理员用9个%xx
表示。
Java代码如下:
String origin = URL;
String encoded = URLEncoder.encode(origin, "UTF-8");
System.out.println(encoded);
String ori = new String(URLDecoder.decode(encoded, "UTF-8"));
System.out.println(ori);
我们知道电子邮件协议是文本协议,如果我们要在电子邮件中添加二进制文件,此时就可以通过Base64编码将二进制文件转换成文本,否则就会出现乱码现象。
Base64编码是一种将二进制数据用文本表示的编码算法,它只包含64个字符,如下所示:
['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
对应的索引分别从0到63。由于Base64只能展示64种文本字符,因此对于二进制数据,它就需要一套映射机制来实现将二进制数据转换成文本数据,即选取3个字节为一组,进行重新分组:每6个bit为一个新的字节,形成4组,如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00
字节在末尾补足后,再在编码的末尾加上1个或2个=
号,表示补了多少字节,解码的时候,会自动去掉。
由于将原先的3个字节变成4个字节,也就是说长度增加了33%,因此,传输效率降低了,目前我们通过将Base64应用于传输少量二进制数据的常见中,例如Cookie、URL等。
Java代码如下:
String origin = "编码测试!";
String encoded = java.util.Base64.getEncoder().encodeToString(origin.getBytes());
System.out.println(encoded);
输出结果是57yW56CB5rWL6K+VIQ==
,末尾有两个=
说明补充了2个\x00
字节。