java采用unicode字符集,采用utf-16编码方式,
如下:"汉"对应的unicode编码为0x6C49,
为何转换为byte[]后,b1[0]=-70,b1[1]=-70 ?
实在搞不明白,如何与unicode中的汉字编码是如何对应的。
byte[] b1 = "汉".getBytes();
如下:"汉"对应的unicode编码为0x6C49,
为何转换为byte[]后,b1[0]=-70,b1[1]=-70 ?
实在搞不明白,如何与unicode中的汉字编码是如何对应的。
byte[] b1 = "汉".getBytes();
getBytes()还有个后面带参数指定字符集的方法,不带参数就用默认字符集,这个默认字符集跟当前系统的环境变量有关。
"汉".getBytes("unicode");不过你得到的是4个字节,前两个你不用关心。后面两个就是你要的。
确实如此 try{
byte[] b="汉".getBytes("unicode");
System.out.println(b.length);
for(int i=0;i<b.length;i++){
System.out.println(b[i]);
}
}catch(Exception e){
}4
-1
-2
73
108
java用的字符集为unicode, 而UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。
其中目前java默认的是UCS-2,即utf-16的方式,这种方式包含2种字节序,Big Endian字节序/Little Endian字节序是
UTF-16 Big Endian:FEFF (没有含义在UCS-2中),其中FEFF为标示码
UTF-16 Little Endian:FFFE (没有含义在UCS-2中),java默认选择Little Endian字节序,故输出顺序见上面,如果改为 byte[] b="汉".getBytes("UTF-16");
则为:但只是高低位的保存位置不同
-2
-1
108,
73楼上输出,对应的16进制存储数据为:
-1 ,1111 1111=-1,FF
-2 ,1111 1110=-2,FE
73 ,0x49=73,低位
108, 0x6C=108,高位
去掉无用的标志位FFFE,故还原后数据仍为0x6C49=unicode编码表中定义的东东