我已经阅读了以下帖子:
- Java中字符串的内部表示是什么?Modified UTF-8? UTF-16?
- https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
现在考虑以下给定的代码:
public static void main(String[] args) {
printCharacterDetails("最");
}
public static void printCharacterDetails(String character){
System.out.println("Unicode Value for "+character+"="+Integer.toHexString(character.codePointAt(0)));
byte[] bytes = character.getBytes();
System.out.println("The UTF-8 Character="+character+" | Default: Number of Bytes="+bytes.length);
String stringUTF16 = new String(bytes, StandardCharsets.UTF_16);
System.out.println("The corresponding UTF-16 Character="+stringUTF16+" | UTF-16: Number of Bytes="+stringUTF16.getBytes().length);
System.out.println("----------------------------------------------------------------------------------------");
}
当我尝试调试上述代码中的character.getBytes()
时,调试器带我进入了String类的getBytes()
方法,然后进入了StringCoding类的static byte[] encode(char[] ca, int off, int len)
方法。在编码方法的第一行 (String csn = Charset.defaultCharset().name();
) 中,调试期间默认编码为"UTF-8"。我预期它应该是"UTF-16"。
程序的输出结果为:
最的Unicode值=6700 UTF-8字符=最 | 默认:字节数=3
相应的UTF-16字符=� | UTF-16: 字节数=6
当我在程序中显式将其转换为UTF-16时,需要6个字节来表示该字符。UTF-16不应该使用2或4个字节吗?为什么要使用6个字节?
我的理解哪里出了错? 我使用Ubuntu 14.04,locale命令显示如下:
LANG=en_US.UTF-8
这是否意味着JVM根据底层操作系统决定使用哪种编码方式,还是仅使用UTF-16?请帮助我理解这个概念。
character.getBytes(StandardCharsets.UTF_16)
。 - Andy Turner