Java编码与解码

本文详细介绍了Unicode、URL及Base64三种常见编码方式的工作原理及Java中的实现方法。探讨了每种编码的特点及其应用场景,比如Base64常用于将二进制文件转化为文本格式以便在网络中传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先区分加密与编码并不是一回事,
本节主要讲述常见的三种编解码方式,分别为:Unicode、URL、Base64。

  1. 常见编码算法:

    • Unicode编码:每一字符都可变成以 \u 开头,长度为6的字符串。
    • URL编码:以百分号%开头,全大写。由于中文在utf-8中大多数以3字节(即24比特位)表示,所以每个汉字都会变成以百分号%开头、紧接着2位16进制数,一共三份、总长度为9的字符串。
    • Base64编码:把二进制数据变成文本格式,这样在很多文本中就可以处理二进制数据。例如要在电子邮件中添加一个二进制文件,就可以使用Base64编码,然后以文本的形式传送。它会把原始数据的长度【约】增加1/3,但其他编码算法并不一定比其更优。
  2. Java常见解码思路:

    • 首先获取被编码的字符流,即byte[]。因为byte是二进制数0/1,相当于获取了最原始的二进制数据,1字节等于8位二进制数bit,范围从-128 ~ 127。
    • 利用String等方式尝试不同的字符集,解码。

    【本质】:用对应的“字符集”来解二进制码。

    // 指定了一种编码方式
    byte[] bytes   = "中文".getBytes("GBK");
    
    // 用相对应的 “字符集” 方式来解码
    String msg = new String(bytes, "GBK");
    
  3. Unicode编解码

    • 需编写固定逻辑,较麻烦,直接使用hutool框架即可。
    // Unicode编码
    String en = UnicodeUtil.toUnicode("中国");
    
    // Unicode解码,\u4e2d\u6587
    String msg="\\u4e2d\\u6587";
    String s = UnicodeUtil.toString(en);
    
  4. URL编解码(Java原生)

    • URLEncoder
    • URLDecoder
    // URL编码
    String en = URLEncoder.encode("中文", StandardCharsets.UTF_8);
    String en = URLEncoder.encode("中文", "utf-8");
    
    // URL解码
    String de = URLDecoder.decode("%E4%B8%AD%E6%96%87", "utf-8");
    
  5. Base64编解码

    • 原理解释:原先是8位一字节,即8位二进制数可以表示一字符;现在我们令6位表示一字符,所以如果原来是【Man】,则会被翻译为【TWFu】,即虽然底层的数据量没变(还是24位),但是所表示的数据长度增加了1/3(由 size = 3 变为 size = 4 )。

      image-20220809211351667

      (3个字节相当于24个比特,对应于4个Base64单元)

    • 另外,如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。【然后】因为被补足的地方会用等于号=作后缀(此时为补足号=而不是6个0代表的索引“A”,这点要分清),所以我们才能经常看到编码的末尾出现等号。

      image-20220809212022315

      (8与16不能被3整除,24才能被3整除)

      image-20220809212528981

      (总共65字符 = 64个字符 + 补足符=

    • Java原生

    // Base64编码
    Base64.getEncoder().encodeToString("中国".getBytes());
    
    // Base64解码
    byte[] bytes = Base64.getDecoder().decode(a);
    String decode   = new String(bytes);
    
    • hutool框架:本质还是源于Java原生的方式,只是作了层简易“封装”,如无必要不建议导入使用。
    String encode = Base64.encode("中国");
    
    String decode = Base64.decodeStr(encode);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThinkStu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值