专栏首页木可大大URL编码和Base64编码

URL编码和Base64编码

在理清字符集和字符编码关系一文中我们介绍了常见字符集以及字符编码之间的关系,本期我们继续朝着这个方向介绍常见的编码算法。

URL编码

URL编码是浏览器发送数据给服务器时使用的编码,它是编码算法,而不是加密算法,URL编码的目的是把任意文本数据编码为以%前缀表示的文本,编码后的文本仅包含A~Za~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编码将二进制文件转换成文本,否则就会出现乱码现象。

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字节。

本文分享自微信公众号 - 木可大大(mukedd),作者:老柯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 理清字符集和字符编码关系

    计算机内部由集成电路(Integrated Circuit,IC)构成,IC的所有引脚,只有直流电压0V和5V两个状态。也就是说,IC的一个引脚,只能表示两个状...

    木可大大
  • 全网VIP影视免费观看!

    国庆假期,想必很多人会追剧看电影,但是很多大平台诸如优酷、爱奇艺等都需要开通VIP才能看到最新热门电影,以我们的气节,购买?不存在的。

    木可大大
  • 漫谈计算机架构

    一说到计算机架构(Computer Architecture),大家可能会有疑问:计算机架构到底是个什么东西?引用维基百科对计算机架构的定义:

    木可大大
  • 前端开发中的字符编码

    前端开发过程中会接触各种各样的编码,比较常见的主要是UTF-8和HTML实体编码,但是web前端的世界却不止这两种编码,而且编码的选择也会造成一定的问题,如前后...

    欲休
  • 一文读懂Base64编码

    我们知道一个字节可表示的范围是 0 ~ 255(十六进制:0x00 ~ 0xFF), 其中 ASCII 值的范围为 0 ~ 127(十六进制:0x00 ~ 0x...

    阿宝哥
  • 【基础知识】497- 一文读懂Base64编码

    我们知道一个字节可表示的范围是 0 ~ 255(十六进制:0x00 ~ 0xFF), 其中 ASCII 值的范围为 0 ~ 127(十六进制:0x00 ~ 0x...

    pingan8787
  • LENGTH 和 CHAR_LENGTH 的区别

    char(N) 和 varchar(N) 这里的N指的是字符长度,而不是字节长度。就是说可以插入N个字符的长度的内容(不管插入的是英文还是中文,反正是按照长度...

    二狗不要跑
  • 做这 12 件简单的小事,能让你更安全地上网

    勒索软件(Ransomware)攻击、身份盗窃,以及在线信用卡欺诈,这些都可能是具有毁灭性的,然而它们只是众多类型的恶意软件与网络攻击中的冰山一角。如果你从来没...

    StoneDemo
  • 计算机程序的思维逻辑 (第7节更新) - 再谈乱码恢复

    在第6节和第7节,我们讨论了文本的二进制编码、乱码、以及恢复,第6节受到了很多读者的一致好评,但第7节有读者反馈解说的不太透彻,希望再详细一点,本文就是对第7节...

    swiftma
  • Ruby设计模式透析之 —— 组合(Composite)

    Java设计模式透析之 —— 组合(Composite) 听说你们公司最近新推出了一款电子书阅读应用,市场反应很不错,应用里还有图书商城,用户可以在其中随意选...

    用户1158055

扫码关注云+社区

领取腾讯云代金券