奇怪的编码输出具有相同的字符串长度

时间:2013-11-23 12:03:53

标签: java encoding utf-8

我找到了一些棘手的地方,无法理解这是怎么发生的。

为什么包含一个字符的字符串可以返回不同的字节数组?

代码:

public class Application {
    public static void main(String[] args) throws Exception {

        char ch;
        ch = 0x0001;
        System.out.println(Arrays.toString(("" + ch).getBytes("UTF-8")));
        ch = 0x0111;
        System.out.println(Arrays.toString(("" + ch).getBytes("UTF-8")));
        ch = 0x1111;
        System.out.println(Arrays.toString(("" + ch).getBytes("UTF-8")));
    }
}

下一步输出:

  

[1]
  [-60,-111]
  [-31,-124,-111]

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

这就是UTF-8的工作原理。 0到127之间的代码点被编码为单字节值(以保持ASCII兼容性);上面的代码点被编码为2到6个字节的值。

Wikipedia screenshot

取自here

的截图

所以,对于你的例子:

  1. 0x00010b00000001)编码为
    (bin)00000001 =(dec)1
  2. 0x01110b00000001 00010001)编码为
    (bin)11000100 10010001 =(dec)-60 -111
  3. 0x11110b00010001 00010001)编码为
    (bin)11100001 11100001 10010001 =(dec)-31 -124 -111