javachar类型的存值范围
采⽤Unicode进⾏编码,char类型在内存中占2个字节-16位,其值的范围在0-65535之间。20 世纪 80 年代开始启动设计 Unicode 编码时,⼈们认为两个字节(16 位)的代码宽度⾜以对世界上各种语⾔的所有字符进⾏编码,并有⾜够空间留给未来的扩展。所以在设计Java 时决定采⽤ 16 位的 Unicode 字符集。⽬前Unicode编码范围在0-1114111之间,显然⼀个char类型已经不能够存65535以外的字符了,Java怎么扩展的我放后⾯讲,这⾥先讲正常情况。
给⼀个赋值的⼏种⽅式,已“严”字为例⼦,严的 是:⼗六进制【4E25】⼆进制【01001110,00100101】⼗进制【20005】。我们可以已下⾯三种⽅式赋值。
1char c1 = '严';
2char c2='\u4E25';
3char c3 = 20005;
4System.out.println(c1);
5System.out.println(c2);
6System.out.println(c3);
将char转换为字符串。
String str = new String(new char[]{c1});
将字符串转换为字节数组,我们⽤UTF-8编码解码⽅式。UTF-8编码⽅式原理请参考
System.out.Bytes("UTF-8")));
打印: [-28, -72, -91]
转换为⼆进制
String.format("%8s", BinaryString(byte & 0xFF)).replace(' ', '0');
打印:11100100,10111000,10100101。这个值就是UTF-8以后⼆进制值。
下⾯来讲解JAVA的char如何表⽰65535以后的的字符。它采⽤的办法是(代理区模式)。
在0-65535之间,保留了⼀部分数字范围(D800–DBFF)和(DC00–DFFF)。
(D800–DBFF)叫⾼代理区和(DC00–DFFF)叫低代理区,各1024,这两个区组成⼀个⼆维的表格,共有
1024×1024=2^10×2^10=2^4×2^16=16×65536,⽤它们来表⽰Unicode中65535以后的字符。
下⾯以⼀个例⼦来说明:
已符号笑脸为例: 在Unicode码表中 ⼗进制 128515,⼗六进制为1F603。
通过查询代理区域对照表(D800–DBFF)和(DC00–DFFF), 1F603对应的⾼端区为D83D,低端区为DE03。通过java代码测试,因为char类型2个字节,所以如果显⽰4个字节的字符需要⽤2个char表⽰。
成功打印出笑脸表情符号unicode编码转换二进制
再看把它写成utf-8的⼆进制形式 = [-16, -97, -104, -125]。
转换为⼆进制[11110000,10011111,10011000,10000011]。
根据UTF-8编码规则转换出实际表⽰编码的⼆进制值,11111011000000011=128515=1F603。
完1
char[] chars = new char[]{'\uD83D','\uDE03'};2
System.out.println(new String(chars));3System.out.String(new String(chars).getBytes("utf-8")));4//=[-16, -97, -104, -125]