编码演进历史(ASCII-Unicode-UTF8)

编码演进历史

ASCII编码:

       由于计算机最早是美国发明的,最早只有127个字符编码到计算机里,包括大小写字母,数字和一些符号。如(十进制:A-65, a-97),完整版见:

ASCII码一览表,ASCII码对照表

各国编码:

        由于世界上有百种语言,只用127个字符显然是远远不够的,于是各国制定了自己的编码标准,如中文的GB2312,韩文的Euc-kr ,日文的Shift_JIS

Unicode编码:

        各国编码有各自的标准,多语言的时候就会出现冲突,乱码的问题,于是Unicode字符集应运而生,将所有字符统一到一套编码中,就不会有乱码问题了。目前Unicode字符集有99024个字符。

        Unicode使用2个字节表示1个字符,如果是生僻字符,需要用到4个字节。ASCII编码使用一个字节表示1个字符。unicode编码查看:查看字符编码(UTF-8)

UTF8编码:

        使用Unicode编码没有乱码问题了,但是如果传输的字符全部都是英文,本来可以使用一个字节表示一个字符,使用Unicode编码的话需要用到两个字节,空间大了一倍,对于存储和传输都是不利的。于是出现了可变长编码:UTF8编码。

        UTF8编码将一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母编码成1个字节,中文通常编码成3个字节,生僻字编码成4-6个字节,如下图所示:

字符ASCIIUnicodeUTF8
A0100000100000000 0100000101000001
01001110 0010110111100100 10111000 10101101

可以看到UTF8是兼容了ASCII码的。在计算机内存中,统一使用Unicode编码(不需要编解码,处理速度快),当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

HEX和Base64编码

        hex编码实际就是16进制编码,也称作base16编码。hex用字符串形式看二进制编码,16进制刚好2个字符表示1个字节。

       使用场景:

       常用于加解密字符传输。如果需要把加密后的字节数组转化为String对象用于网络传输时,如果把字节数组转为UTF8等编码方式,可能存在某些字节在该编码中找不到对应的字符,造成传输信息丢失。这时就可以通过二进制编码格式hex或base64编码实现。

        两种编码方式区别

HEXBase64
编码原理

 Hex编码的原理就是将原来8位的二进制字节打断,分成两个4位的,并且在前面加上4个零,进行补位,这样一个8位二进制字节就变成了2个8位的二进制字节,再将新得到的2个二进制字符进行16位进制转换,得到的新的16位字符串就是Hex的值。

总结来说hex编码后字节长度变为原来的2倍

每3个字节分为一组,3个字节为24bit,然后每6个bit占用1个字节,得到4个字节。将4个字节数组映射到base64编码表,得到4个字符。

(1)最后一组只有2个字节=16bit,需要在末尾补2个0,按照上述规则得到3个字符,最后补一个=

(2)最后一组只有1个字节=8bit,需要在末尾补4个0,按照上述规则得到2个字符,最后补两个==

代码举例

package com.test.api;

import org.apache.commons.codec.binary.Hex;

import java.util.Arrays;

public class TestHex {
    public static void main(String[] args) {

        //一个字符串
        String hex = "HEX";
        //获取字符串的byte数组,十进制 H-72,E-69,X-88
        byte[] buf = hex.getBytes();
        //输出byte数组
        System.out.println(Arrays.toString(buf));
        //转换成Hex输出
        System.out.println(Hex.encodeHexString(buf));
    }
}

'abc'字符串 底层的二进制为 011000010110001001100011,这是24个bit为一组,以6bit分为四部分为 011000 010110 001001 100011 编码成对应上表的字符 ’ YWJj' 

'ab'字符串 底层的二进制为 0110000101100010,补位成 011000010110001000,以6bit分为三部分为 011000 010110 001000 编码成对应上表的字符 ’ YWI' ,因为比一般的少一个编码单位,所以在后面加上一个=字符,最终的结果就是 ’ YWI='
 

'a'字符串 底层的二进制为 01100001,补位成 011000010000这是24个bit为一组,以6bit分为四部分为 011000 010000 编码成对应上表的字符 ’ YQ' ,因为比一般的少两个编码单位,所以后面加上两个=字符,最终的结果就是 ’ YQ=='

优缺点解码编码速度快但是体积变大了一倍 体积小,但是由于算法相对复杂所以解码编码速度比较慢。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值