- Java基本类型占用的字节数:
1字节: byte , boolean
2字节: short , char
4字节: int , float
8字节: long , double
注:1字节(byte)=8位(bits) - 计算机编码方式与规则
- Ascii编码一个字节表示一个字符,共127个字符。随着发展,又扩展了127号之后的字符编码:“扩展字符集”。
- DBCS - Double Byte Charecter Set 双字节字符集 (GB2312 -> GBK -> GB18030)中文编码
舍弃ASCII 127号之后的编码字符,进行增加一个字节扩展字符编码,两个字节表示一个中文字符。
GB2312共收录6763个简体汉字,是一般输入法的默认编码 ;
GBK共收录21004个汉字(包括简体和繁体),是字库庞大的输入法的首选编码;
GB18030 分别以单字节、双字节和四字节进行编码。兼容了GBK和GB2312。当然也支持繁体中文; - Unicode
通常是2个字节表示一个字符。在用法上,都是用两个字节表示一个字符。
但是与DBCS不同的是,Unicode为 ISO (国际标谁化组织)标准编码。(^.^)
由于英文字符用两个字节表示,太浪费空间了,所以衍生了可变长编码Utf-8,也是Unicode的实现的一种标准
字符 | ASCII | Unicode | UTF-8 |
A | 01000001 | 00000000 01000001 | 01000001 |
中 | - | 01001110 00101101 | 11100100 10111000 10101101 |
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,
汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
- 代码单元与代码点代码点:编码表(比如Unicode)中某个字符的代码值(数字);
代码单元:编码表字符的最小存储单元,不同的编码,代码单元的大小也是不一样的。
一个字符,仅仅对应一个代码点,但却可能有多个代码单元。
在Java中,char类型用UTF-16编码描述一个代码单元。使用代码单元而非字符,与Unicode字符集的增补相关。
String的length方法得到的是UTF-16编码对应的代码单元数量,而非字符个数;
charAt方法得到的是指定位置的代码单元,而非字符。
获取字符个数需要调用codePointCount方法,获取单个字符需要调用codePointAt方法。