编码相关概念之一

1.ASCII码

  • 一般用7位或8位二进制表示,也就是可以表示128或256个字符
  • 标准的ASCII码用7位表示,共127个字符,觉见的有
    1. 0-31及127,共33个,一般为控制字符,不可见
    2. 32-126,共95个,一般为可见字符,其中48-57为0到9十个阿拉伯数字,65-90为大写字符,97-122为小写字母,还有其它标点符号、运算符号等
  • 后128个为扩展ASCII码,用于扩展ASCII码字符

2.UTF-8编码

  • 是unicode编码的一种具体实现方式,unicode本身仅为一个符号编码集,并不包含怎么在网络上进行传输
  • 是可变长度的,一般为1-4个字符
    1. 单字节时,首位为0,一般可表示为0xxxxxxx
    2. 双字节时,首字节前2个字符为2个1,后紧跟0,次字节以10开头,可表示为110xxxxx 10xxxxxx
    3. 三字节时,首字节前3个字符为1,后紧跟0,次字节、第3字节以10开头,可表示为1110xxxx 10xxxxxx 10xxxxxx
    4. 四字节时,首字符前4个字符为1,后紧跟0,后3个字节以10开头,可表示为可表示为11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

3. URL编码

  • 当我们用浏览器访问某个URL地址时,有些服务器可能只能识别ASCII码字符,如果其中包括一些中文等其它字符时,我们要进行如下的转换,转换规则如下:
    1. 如果1-9,A-Z,a-z,还有-_.*这些字符时,则保持不变
    2. 如果是其它字符,则先转换为UTF-8编码,再对每个字节前加%来表示,%后面的编码要用大写来表示
  • 编码示例
import java.net.URLEncoder;
URLEncoder.encode("你好", StandardCharsets.UTF_8); //%E4%BD%A0%E5%A5%BD

“你好”,经编码后,会看到每两个字符一起,前面都有一个%,这里我们可以看到,“你好”都使用了3字节来表示,
刚好可以验证一个前面的utf-8编码,“你”的3字节表示为E4,BD,A0,解析为二进制为11100100 10111101 10100000,
可以看到首字节前面为3个1,带1个0,后面两个字节都以10开头,没毛病。

  • 解码示例
import java.net.URLDecoder;
URLDecoder.decode("%E4%BD%A0%E5%A5%BD", StandardCharsets.UTF_8); //你好
  • 只是编码算法,非加密算法

4. BASE64编码

  • 将任意的二进制数据变为文本
  • 用64位,也就是3个字节表示
  • 字符包括:A-Z(0-25)、a-z(26-51)、0-9(52-61)、+(62)、/(63)
  • 编码解码示例
import java.util.Base64;
String encoder1 = Base64.getEncoder().encodeToString("abc".getBytes()); //YWJj,这里3字节*8位=24位,24位/6位=4个字符
new String(Base64.getDecoder().decode(encoder1)); //abc 可以正常还原出原来的字符串
  • 如果byte[]数组长度不是3的倍数,怎么办呢,这时我们会在末尾补0x00,少两个会补两个0x00,在编码时,直接在末尾会加上一个=或是两个=
    ???,为啥可以直接补0x00呢,不会误以为是A吗,编码也是0,因为原字符是字节编码的,必然是8的倍数,而Base64是6的倍数,除8后余数就是在后面补的0x00的个数,yes!
  • 只是编码算法,非加密算法哦

你可能感兴趣的:(编码相关概念之一)