比如這斷程序:
char word = '字'; System.out.println("字".getBytes().length); // 輸出為 3
其輸出結果為3, 小伙伴們就要問了:“奇怪了,'字'這個字符,明明是三個字節,怎么可以用char類型的變量來表示? char類型不是在java中是兩個字節么?”
其實,java中有外碼和內碼之分,顧名思義,外碼就是JVM外部使用的編碼,比如你在編輯器中輸入的“字”,假設是UTF-8編碼,UTF-8是變長編碼,一個中文可能是1-3個字節來表示;那么,在JVM中,用的都是Unicode碼,這是定長編碼,所有字符都統一使用兩個字節表示,這就是Java的內碼。
"字".getBytes() JVM執行這段邏輯,實際是進行了編碼轉換的,可以看String的源碼實現:
public byte[] getBytes() { return StringCoding.encode(value, 0, value.length); // 調用StringCoding.encode() }
static byte[] encode(char[] ca, int off, int len) { String csn = Charset.defaultCharset().name(); // 這里,Charset.defaultCharset()默認是UTF-8 try { // use charset name encode() variant which provides caching. return encode(csn, ca, off, len); } catch (UnsupportedEncodingException x) { warnUnsupportedCharset(csn); }
可以看到,Java把字符串"字"(字符串就是char的數組), 編碼為UTF-8 , 轉為UTF-8的“字”, 它的長度就變成了3個字節哦。