Java 使用哪种编码 UTF-8 或 UTF-16?
我已经阅读了以下帖子:
- Java对String的内部表示是什么?修改后的 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("----------------------------------------------------------------------------------------");
}
当我尝试调试上面代码中的行时,调试器将我带入了 String 类的方法,然后进入了 StringCoding 类的方法。编码方法 () 的第一行在调试期间返回“UTF-8”作为默认编码。我以为它是“UTF-16”。character.getBytes()
getBytes()
static byte[] encode(char[] ca, int off, int len)
String csn = Charset.defaultCharset().name();
该程序的输出为:
Unicode 最 = 6700 的 Unicode 值 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?请帮助我理解这个概念。