Java中為什么可以用一個char(兩個字節)表示一個中文字符


  比如這斷程序:

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個字節哦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM