Java编码与解码_unicodeutil给url编码

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

首先区分加密与编码并不是一回事

本节主要讲述常见的三种编解码方式分别为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);
    
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java