char类型原本表示单个字符,但由于Unicode字符集扩充,导致有些字符需要使用两个char来描述
大小: 一个char类型占两个字节,16位
范围: 为十进制数 0 ~ 65535(即0 ~ 216-1),Unicode表示\u0000 ~ \uFFFF
定义方式:
char a1 = 'A'; // 使用单引号定义一个char
char a2 = '\u0041'; // unioncode编码定义,与上面定义等价
char a3 = 65; // 等价运算1 接受8进制、10进制、16进制数字,表示其在Unicode编码中的位置
运算:
char a1 = 'A' + 1; // 值为 B
转义序列:
除了\u的Unicode字符外,还有一些转义序列可出现在char字面量中(单引号里)
| 转移序列 | 名称 | Unicode值 |
|---|---|---|
| \b | 退格 | \u0008 |
| \t | 制表 | \u0009 |
| \n | 换行 | \u000a |
| \r | 回车 | \u000d |
| \’ | 单引号 | \u0022 |
| \" | 双引号 | \u0027 |
| \\ | 斜杠 | \u005c |
// 以下三者等价
char a1 = '\b';
char a2 = '\u0008';
char a3 = 0x0008;
注意: Unicode转移序列会在解析代码之前转换,使用中须小心
示例:
// \u000A is a newline
// 会产生一个语法错误,因为编译时\u000A会替换为换行符
// look inside c:\user
// 同样报错,因为\u后没有跟16进制数
Unicode目的是解决各字符集编码方式不统一的问题,当时工程师预估只用2byte的代码宽度即可对世界上所有语言的所有字符进行编码,该工程从20世纪80年代启动,于1991年发布Unicode1.0,仅占用216-1(65536)的一半不到。Java设计时使用16位的char以支持Unicode,此后由于加入大量汉语、日语、韩语的表意文字,导致16位的char已不能满足Unicode的需要。
名词解释:
码点(code point): 指一个编码表中一个字符代表的编码值
在Unicode中码点采用16进制书写,并加前缀 U+,如:U+0041代表拉丁字母A的码点
代码平面(cod plane)
Unicode的码点可分为17个代码平面
第一个代码平面称为_基本多语言平面_(basic multilingual plane),包括码点从U+0000到U+FFFF的“经典”Unicode代码
其余16个代码平面为从U+10000到U+10FFFF,包括_辅助字符_(supplementary character)
以下为Java解决Unicode扩容问题的方案:
UTF-16编码采用不同长度的编码表示所有Unicode码点,在基本多语言平面中,每个字符用16位表示,通常称作_代码单元_(code unit);而辅助字符编码为一对连续的代码单元。采用这种编码对表示的各个值落入基本多语言平面中未用的2048个值范围内,通常称为_替代区域_(surrogate area)(U+D800~U+DBFF为第一个代码单元, U+DC00~U+DFFF为第二个代码单元)。如此设计,我们可以迅速判断一个代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。
关于编码的算法详见(https://tools.ietf.org/html/rfc2781)
注意: 强烈建议不要在Java中使用char类型,除非确实需要处理UTF-16代码单元