JVM之外
在 JVM 之外, .java
文件可以采用多种编码格式:
- UTF-8 - unix linux 默认
- GBK - 中文 windows 平台默认
当将源码用 Javac 编译的时候, 默认是按照系统默认的编码格式读取 Java 源文件,
然后以 UTF-8
的格式输出到 .class
字节码文件中.
换句话说:
- 默认情况下在 Unix 平台, Javac 用
UTF-8
格式读取源文件然后以UTF-8
格式写.class
- 默认情况下在中文 windows 平台, Javac 用
GBK
格式读取源文件然后同样以UTF-8
格式写.class
JVM之内
当运行代码时, 读入到内存里的字符(char)或字符串(String), 实质上都是用 char 来表示的(String 实质是 char[]
), 而 char 是采用 UTF-16
来编码的.
但需要注意, char 永远是 2 个字节. 但对于超过 2 个字节的 UTF-16 编码的字符来说. 需要多个 char 来表示. 比如 emoji 表情. 比如某些 APP 输入框输入表情占用了 2 个字符. 就是字符串长度不等于字符长度的问题!
String a = new String(new byte[]{(byte)0xF3, (byte)0x3F, (byte)0xF2, (byte)0x2F});
System.out.println(a);
System.out.println(a.toCharArray().length); // 输出 2
输出 2, 也就是 2 个 char 即 4 个字节.
总结
- JVM 外部, Javac 默认是按照系统默认的编码格式读取 Java 源文件, 但是统一按
UTF-8
编译.class
字节码文件. - JVM 内部采用
UTF-16
编码