一. char的本质
- 在 Java内部进行字符处理时,采用的都是Unicode,具体编码格式是UTF-16BE。
- BE (Big Endian)就是先输出高位字节,再输出低位字节,这与整数的内存表示是一致的。
- char本质上是一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字符。
- 由于固定占用两个字节,1个char只能表示Unicode编号在65536以内的字符,而不能表示超出范围的字符。
二. 一个char是否对应一个字符?
1. char 包含2个字节,对应的是utf-16中的一个代码单元。
代码单元 = 字符编码中的基础单元
2. unicode字符集里,每一个字符对应着一个唯一的整数——码点(code point);如:
基本多语言平面(BMP)【U+0000,U+FFFF】; BMP字符只需要1个char
辅助平面 【U+100000,U+10FFFF】; 辅助字符需要2个char
三. char的赋值
char有多种赋值方式:
- char c = 'A'
- char c = '马'
- char c = 39532
- char c = 0x9a6c
- char c = '\u9a6c'
第1种赋值方式是最常见的,将一个能用Ascii码(0~127)表示的字符赋给一个字符变量。
第2种也很常见,赋值的时候是按当前的编码解读方式,将这个字符形式对应的Unicode编号值赋给变量,'马'对应的Unicode编号是39532,所以第2种赋值和第3种是一样的。
第3种是直接将十进制的常量赋给字符
第4种是将16进制常量赋给字符
第5种是按Unicode字符形式。
以上,2,3,4,5都是一样的,本质都是将Unicode编号39532赋给了字符。
四.char的运算
由于char本质上是一个整数,所以可以进行整数可以进行的一些运算,在进行运算时会被看做int,但由于char占两个字节,运算结果不能直接赋值给char类型,需要进行强制类型转换,这和byte, short参与整数运算是类似的。
char类型的比较就是其Unicode编号的比较。
char 的加减运算就是按其Unicode编号进行运算,一般对字符做加减运算没什么意义,但Ascii码字符是有意义的。比如大小写转换,大写A-Z的编号是 65-90,小写a-z的编号是97-122,正好相差32,所以大写转小写只需加32,而小写转大写只需减32。加减运算的另一个应用是加密和解密,将 字符进行某种可逆的数学运算可以做加解密。
char的位运算可以看做就是对应整数的位运算,只是它是无符号数,也就是说,有符号右移>>和无符号右移>>>的结果是一样的。