字符编码ASCII、Unicode、GB

计算机的存储都是二进制的,那么我们平时看到的各种字符都需要通过按照一定的格式转换成为二进制才能在被计算机识别与处理。这个过程便成为编码。常见的编码方式有ASCII、Unicode、GB2312等。

1.ASCII码;

2.Unicode字符集;

3.GB2312汉字编码;

1.ASCII码:

我们知道计算机中一个字节(byte)是由八位二进制表示的,每个二进制为0或者1,因此一个字节一共可以表示256个字符。ASCII码是指使用一个字节的低七位表示128种字符,这些字符有些是可以打印的,有些是用于控制起到特定效果的非打印字符。对于ASCII码我们应该都很熟悉,比如大小写的拉丁字母、数字、和标点符号,./等都可以通过ASCII码来编码。

但是ASCII码仅能表示128个字符,这对于除了英语以外,其它的语言是不够用的,因此有些地方便保持低七位不变仍对应原先的128个字符,而将高八位也使用上去变成一共256个字符,用来表示基础ASCII码未能表示的字符,和其它国家的语言字符。但是这又造成了不同的国家后128个字符各不相同的情况,而且256个字符对于汉字等语言是远远不够的。因此便出现了Unicode字符集。

2.Unicode字符集:

相对于ASCII码只能表示128或256个字符的情况,Unicode是联合国制定的用于涵盖所有国家字符的字符集,它用双字节或者多个字节表示。需要说明的是Unicode只是一个字符集,它表明了字符和二进制之间的对应关系,并不说明字符是如何编码存储的。而实现其编码方式的是UTF-8、UTF-16等。所以UTF-8、UTF-16等才是其对应的编码方式。

UTF-8:

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。而且他是兼容ASCII码的,也就是说原先的ASCII字符用UTF-8编码仍是占用一个字节,并且编码与ASCII相同。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-16:

与UTF-8相似,只是UTF-8使用8位编码,占用1-4个字节,而UTF-16使用16位编码,占用2或4个字节。

对于Unicode字符集还存在一个问题,就是编码是字节排序的问题,即Little
endian和Big endian。比如使用双字节表示Unicode码E1 A5时。按照Little
endian方式是低位在前高位在后,即存储为E1 A5;而按照Big endian方式时是高字节在前低字节在后,即存储为A5 E4。

3.GB2312汉字编码:

GB2312与GB18030是国标对汉字的编码。GB18030兼容GB2312。都使用双字节表示。而GBK则是对国标码的扩充。同样也用双字节表示。

上一篇:hashCode()和toString()


下一篇:字符编码 ASCII,Unicode 和 UTF-8 概念扫盲