今天面試被問到“Java中的char能存中文嗎?”,我回答有的字能有的字不能,結果被嘲笑了,不過我也忘了字符編碼的相關知識所以也沒能解釋。晚上查了下資料,記錄一下。
網上搜索這個問題,答案清一色都是能,畢竟隨便寫行代碼都能清晰地證明可以:
char c = '我';
但是事實並不是那么簡單,Java的char內部編碼為UTF-16,請參考String編碼(二) 證明JAVA的char編碼為UTF-16
Java 的char用兩字節存儲,表示范圍從 '\u0000' 到 '\uffff' ,也就是從0到65535。事實上,一個 char不能表示65535個字符,因為只有U+0000 到 U+D7FF 和 U+E000 到U+FFFF能用來表示 一個完整的字符,這些叫做 BMP,另外的作為high surrogate和 low surrogate 拼接組成由4字節表 示的字符。
在UTF-16編碼中,大於U+10000碼位將被編碼為一對16比特長的碼元,即按4個字節編碼,此時char無法表示。utf16編碼格式
所以Java的char只能表示utf16中的bmp部分字符。對於CJK(中日韓統一表意文字)部分擴展字符集則無法表示。
例如,下圖中除Ext-A部分,char均無法表示。

