getBytes("UTF-16")长度多2的原因

public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
String a="a";
System.out.println(a.length());
byte[] bb= a.getBytes("UTF-16");
System.out.println(binary(bb,16));


System.out.println(bb.length);

}

public static String binary(byte[] bytes, int radix){
return new BigInteger(1, bytes).toString(radix);
}
}

结果是
1
feff0061
4
[size=medium]为什么getBytes("UTF-16")之后byte数组的长度是4呢?不应该是2吗[/size]
[size=medium]我们来具体看下 0061 就是a的二进制表示,那前面的feff是什么东西呢?


在wiki上我们可以看到:
UTF-16的大尾序和小尾序存储形式都在用。一般来说,以Macintosh制作或存储的文字使用大尾序格式,以Microsoft或Linux制作或存储的文字使用小尾序格式。
为了弄清楚UTF-16文件的大小尾序,在UTF-16文件的开首,都会放置一个U+FEFF字符作为Byte Order Mark(UTF-16LE以FF FE代表,UTF-16BE以FE FF代表),以显示这个文本文件是以UTF-16编码,其中U+FEFF字符在UNICODE中代表的意义是ZERO WIDTH NO-BREAK SPACE,顾名思义,它是个没有宽度也没有断字的空白。

原来FE FF代表 UTF-16BE ,就是大尾序格式,显示的是0061
可以看到我们换成
byte[] bb= a.getBytes("UTF-16BE"); 得到的结果就是0061了
反之
byte[] bb= a.getBytes("UTF-16LE"); 得到的结果就是6100了[/size]

[size=large]结论:getBytes("UTF-16")的byte长度会比我们预期的多2,就是两个byte开头要指定是大尾格式,还是小尾格式 。。[/size]

你可能感兴趣的:(那些蛋疼的事)