每一个字节存储一个ASCII码,一个字节为8位,于是一个字节能代表128个字符,也就是常见的ASCII码
每一个字节存储一个ASCII码,一个字节为8位,于是一个字节能代表128个字符,也就是常见的ASCII码
每个字符用32位即4字节表示,但是要浪费大量的空间
谣传:每个字符用16位即2字节表示,还是要浪费大量的空间
其实UTF-16是变长的
UTF-16编码方式源于UCS-2(Universal Character Set coded in 2 octets、2-byte Universal Character Set)。而UCS-2,是早期遗留下来的历史产物。
UTF-16兼容UCS-2,UCS-2是定长的
其编码固定占用2个字节
依照这个思路,每个字符用8位即1字节表示,那就错了
UTF-8是可变长的,占1到6个字节都是可能的
1.如果第一个字节的第一位为0,那么就代表占一个字节
0XXXXXXX
(剩下的X为记录的内容信息)
2.如果第一个字节的前三位为110,第二个字节的前两位为10,那么代表总共占了两个字节
110XXXXX 10XXXXXX
3.如果第一个字节的前三位为110,第二和第三个字节的前两位为10,那么代表总共占了三个字节
1110XXXX 10XXXXXX 10XXXXXX
4.同理占了四个字节就为
11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
5.最大到六个字节
1111110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
对于UTF-8编码的任意字节
第一位可以判断是否为ASCII字符
第二位可以判断该字节是否为一个字符编码的第一个字节
如果前两位均为1,可以确定该字节为字符编码的第一个字节
注意这里说的是早期的UTF-16版本,也就是是UCS-2,它是定长的,并不现在真正意义上的utf-16
在jvm规范中明确说明了java的char类型使用的编码方案是UTF-16
UTF-16固定长度,而UTF-8需要根据存储信息去判断长度,如果要搜索指定位置的char,比如说要检索出第20个字符,UTF-16直接就能算出字符内存位置,而对于UTF-8由于是变长,要判断每一个字符的长度,大大降低了效率
UTF-8时间效率不如UTF-16,所以采用了UTF-16方案
这大概是当时设计者为了平衡运行时的时间效率(采用定长编码的UTF-16)与外部存储的空间效率(采用变长的UTF-8编码)而做的取舍
不过呢,还得从时间上考虑,Java是1995年出的,UTF-8是2003年出的