JVM之外
在 JVM 之外, .java
文件可以采用多種編碼格式:
- UTF-8 - unix linux 默認
- GBK - 中文 windows 平臺默認
當將源碼用 Javac 編譯的時候, 默認是按照系統(tǒng)默認的編碼格式讀取 Java 源文件,
然后以 UTF-8
的格式輸出到 .class
字節(jié)碼文件中.
換句話說:
- 默認情況下在 Unix 平臺, Javac 用
UTF-8
格式讀取源文件然后以UTF-8
格式寫.class
- 默認情況下在中文 windows 平臺, Javac 用
GBK
格式讀取源文件然后同樣以UTF-8
格式寫.class
JVM之內(nèi)
當運行代碼時, 讀入到內(nèi)存里的字符(char)或字符串(String), 實質上都是用 char 來表示的(String 實質是 char[]
), 而 char 是采用 UTF-16
來編碼的.
但需要注意, char 永遠是 2 個字節(jié). 但對于超過 2 個字節(jié)的 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 個字節(jié).
總結
- JVM 外部, Javac 默認是按照系統(tǒng)默認的編碼格式讀取 Java 源文件, 但是統(tǒng)一按
UTF-8
編譯.class
字節(jié)碼文件. - JVM 內(nèi)部采用
UTF-16
編碼