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,我试了一下其它的字也都是这样。记一下这个问题。
文档:
update: 显式也是双字节,输出的4个字,其中前两个字节-2, -1就是oxFEFF,是个BOM头。。。
System.out.println(Arrays.toString(new String("张张").getBytes("UNICODE")));
[-2, -1, 95, 32, 95, 32] 只输出了一次BOM头