2013-11-23 25 views
0

奇怪的编码,我发现了一些棘手的地方,不明白为什么这是否正是发生。输出具有相同的字符串长度

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

代码:

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]

为什么会发生这种情况?

回答

2

这是UTF-8是如何工作的。 0和127之间的码点被编码为单字节值(以维持ASCII兼容性);上面的代码点被编码为2到6个字节的值。从here采取

截图。

因此,对于你的例子:

  1. 0x00010b00000001)被编码为
    (BIN)00000001 =(DEC)1
  2. 0x01110b00000001 00010001)被编码为
    (BIN)11000100 10010001 =(分解)-60 -111
  3. 0x11110b00010001 00010001)被编码为
    (bin)11100001 11100001 10010001 =(dec)-31 -124 -111
相关问题