Java中默认的编码方式是Unicode !
在学习字节流和字符流的时候,突然发现自己对字符集编码不是很了解,所以特意学习一发,总结ASCII,Unicode,UTF-8的对比。
- 计算机内部以二进制位(bit)作为基础数据,所以就有0和1两种状态。
- 八个二进制位(bit)为一个字节(byte),可以组合出256种状态,每一个状态对应一个符号共256个符号,从0000000到11111111。
因此在上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
因为英语128个符号就可以了,但是其他国家是远远不够的,语言系统完全不一样。所以他们各自都很聪明,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
编码很混乱
各个国家自己扩展了自己语言系统的编码,于是全球出现无数种乱七八糟的编码。比如说下中国:
- 一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。
- 采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!
- 他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”。
但是呢,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。所以实际上这个Unicode只是一个字符的协议文档,具体的实现是由各自实现的,所以衍生出UTF-8,UTF-16,UTF-32。
总结一下,他们的关系如图: