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
为什么getBytes("UTF-16")之后byte数组的长度是4呢?不应该是2吗
我们来具体看下 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了


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

猜你喜欢

转载自huangyunbin.iteye.com/blog/2375464