记点东西
2013年01月7日java

没有评论
276,902 views

java中char,unicode

    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头

BOM:http://baike.baidu.com/view/126558.htm#sub5073178

返回顶部