为什么使用UTF-16编码会得到一个奇怪的字节序列?

时间:2019-03-27 12:43:26

标签: java

byte[] byt = "君".getBytes(StandardCharsets.UTF_8);
for (byte b : byt) {
    System.out.println(Integer.toBinaryString(b));
}

输出:

11111111111111111111111111100101
11111111111111111111111110010000
11111111111111111111111110011011

这是正确的。

但是:

byte[] byt = "君".getBytes(StandardCharsets.UTF_16);
for (byte b : byt) {
    System.out.println(Integer.toBinaryString(b));
}

输出:

11111111111111111111111111111110
11111111111111111111111111111111
1010100
11011

君的十六进制代码为101010000011011

所以:

11111111111111111111111111111110
11111111111111111111111111111111

这是什么?

1 个答案:

答案 0 :(得分:3)

字节0xFEFF

的第一个
11111111111111111111111111111110
11111111111111111111111111111111

是字节顺序标记-它们告诉其余部分是使用Big Endian还是Little Endian编码的。

如果您不需要它们,则可以显式设置编码-使用StandardCharsets.UTF_16LEStandardCharsets.UTF_16BE