字节编码

最早的编码是iso8859-1,和ascii编码相似

计算机能够直接识别并处理的只有二进制,在二进制的世界中,只有0和1这2种数字,所有的数据都是由0和1组成的序列!

二进制数据中的每个0,或者每个1,所需占据的存储空间是1个位(bit),通常使用字节(byte)作为最基本的存储单位,每个字节占8个位。

1位:0, 1
2位:00, 01, 10, 11
3位:000, 001, 010, 011, 100, 101, 110, 111
每个字节占8个位,可以表达256种不同的0、1组成的序列,除去最左侧的固定作为符号位,还剩余7个位,则可以表达128种不同的0、1组成的序列。

最早制定的ASCII码表中就记录了所有的英文字母、数据、标点符号、特殊按键与0、1组成的二进制序列的对应关系,例如大写字母a对应的就是110 0001,转换成十进制就是97。当需要计算机处理a时,计算机就会根据110 0001来处理,反之,当计算机处理的结果是110 0001时,就会在屏幕中显示出a。

所以,所谓的编码表,其实就是记录了对应关系的表!

但是,ASCII码表只能适用英文语言,却无法适用于使用其它语言的国家和地区!因为ASCII码表是使用1字节来记录对应关系的,只能表达128种不同的意义,而中文的汉字种类太多,使用1个字节是无法记录各种对应关系的!所以,在任何一门编程语言中,如果要表达汉字,每个汉字至少需要占2个字节!

由于ASCII码表中并没有记录汉字与二进制序列的对应关系,所以,使用中文,需要支持中文的编码表,例如GBK、UTF-8。

Java语言默认使用2个字节作为1个字符,使用的是Unicode编码,默认情况下可以表示32768种不同的二进制序列,也就可以记录32768种字符!

但是,在实际传输时,一次传输的字符较多时,可能会出现无法正确区分的问题,例如传输的是1010 1111 0001 1100 1011 1100 1011 1101时,共4个字节,接收方可能就无法区分这个序列到底是1个ASCII码+1个中文+1个ASCII码,还是2个中文,还是2个ASCII码+1个中文,或1个中文+2个ASCII码,甚至是4个ASCII码!

所以,在数据需要传输时,就需要使用到UTF-8这种传输编码(UTF:Unicode Transfermation Format)。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

在UTF-8中,对于多字节组成的二进制序列的编码规则例如:

2字节: 110 ??? 10 ???

3字节: 1110 ??? 10 ??? 10 ???

4字节: 11110 ??? 10 ??? 10 ??? 10 ???
UTF-8编码的细节版本又有utf8mb3和utf8mb4,分别表示Max Byte 3和Max Byte 4的意思!

在MySQL数据库中,使用UTF-8,其实表示的是utf8mb3,也支持utf8mb4,需要显式的指定为utf8mb4。

你可能感兴趣的:(字节编码)