char c = '张';
byte b[] = new byte[3];
b[0] = (byte) ((c & 0xFF0000) >> 16);
b[1] = (byte) ((c & 0x00FF00) >> 8);
b[2] = (byte) (c & 0x0000FF);
System.out.println(Arrays.toString(b));
System.out.println(Arrays.toString(new Character(c).toString().getBytes("UNICODE")));输出:
[0, 95, 32]
[-2, -1, 95, 32]
“张”的code point:U+5F20,可以看出java内部char使用的是双字节来存储unicode,这样的话,除了BPM,其它其它辅助平面里面的字符是没有办法直接使用,只能当成byte来处理。但是,当我显式获得字符的unicode的时候却是4个字节,看情况应该是ucs4,但是高16位却是-2,-1而不是0,我试了一下其它的字也都是这样。记一下这个问题。
文档:
http://zh.wikipedia.org/wiki/Unicode%E5%AD%97%E7%AC%A6%E5%88%97%E8%A1%A8#Unicode_.E7.BC.96.E7.A0.81.E8.A1.A8
update: 显式也是双字节,输出的4个字,其中前两个字节-2, -1就是oxFEFF,是个BOM头。。。
System.out.println(Arrays.toString(new String("张张").getBytes("UNICODE")));[-2, -1, 95, 32, 95, 32] 只输出了一次BOM头