【Java面經整理】char可以存漢字嗎,底層是怎麼存的——char類型詳解

ps:Java面試題整理專欄,專門收集整理搬運面試題和答案

char可以存漢字嗎,底層怎麼存的

char是按照字符存儲的,不管英文還是中文,固定佔用佔用2個字節(16位),用來儲存Unicode字符。範圍在0-65536。
unicode編碼字符集中包含了漢字,所以,char型變量中是可以存儲漢字的。不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變量中就不能存儲這個特殊漢字。

以下部分內容來自《Java核心技術 卷I》

char:

char類型是一個單一的 16 位 Unicode 字符;
最小值是 \u0000(即爲0);
最大值是 \Uffff(即爲65,535);
char 數據類型可以儲存任何字符;
例子:char letter = ‘A’;。

,char 類型的值可以表示爲十六進制值,其 範圍從 \u0000 到 \Uffff。
例如:\u2122 表示符號 ™, \u03C0 表示希臘字母 it,\u6211\u7231\u4f60表示字符串“我愛你”
在這裏插入圖片描述
除了轉義序列 \u之外, 還有一些用於表示特殊字符的轉義序列, 請參看表 3-3。所有這 些轉義序列都可以出現在加引號的字符字面量或字符串中。例如,’\u2122’或"Hello\n”。轉義序列 \u還可以出現在加引號的字符常量或字符串之外(而其他所有轉義序列不可以) 。
例 如:

  public static void main(String\u005B\u00SD args)

就完全符合語法規則, \u005B 和 \u005D 是 [ 和 ] 的編碼。

表 3-3 特殊字符的轉義序列

轉義序列 名稱 Unicode值
\b 退格 \u0008
\t 製表 \u0009
\n 換行 \u000a
\r 回車 \u000d
\ " 雙引號 \u0022
單引號 \u0027
\ 反斜槓 \u005c

警告: Unicode 轉義序列會在解析代碼之前得到處理。 例如,"\u0022+\u0022”並不是一 個由引號(U+0022) 包圍加號構成的字符串。 實際上, \u0022 會在解析之前轉換爲 ", 這 會 得 到 ""+"" ,
也 就 是 一 個 空 串。


Unicode 和 char 類型

要想弄清 char 類型, 就必須瞭解 Unicode 編碼機制。Unicode 打破了傳統字符編碼機制 的限制。在 Unicode 出現之前, 已經有許多種不同的標準:美國的 ASCII、 西歐語言中的 ISO 8859-1 俄羅斯的 KOI-8、 中國的 GB 18030 和 BIG-5 等。這樣就產生了下面兩個問題: 一個是對於任意給定的代碼值,在不同的編碼方案下有可能對應不同的字母;二是採用大字 符集的語言其編碼長度有可能不同。例如,有些常用的字符采用單字節編碼, 而另一些字符 則需要兩個或更多個字節。
設計 Unicode 編碼的目的就是要解決這些問題。在 20世紀 80 年代開始啓動設計工作時, 人們認爲兩個字節的代碼寬度足以對世界上各種語言的所有字符進行編碼, 並有足夠的空間 留給未來的擴展。在 1991 年發佈了 Unicode 1.0, 當時僅佔用 65 536 個代碼值中不到一半的 部分。在設計 Java 時決定採用 16 位的 Unicode 字符集,這樣會比使用 8 位字符集的程序設 計語言有很大的改進。
十分遺憾, 經過一段時間, 不可避免的事情發生了。Unicode 字符超過了 65 536 個,其 主要原因是增加了大量的漢語、 日語和韓語中的表意文字。現在, 16 位的 char 類型已經不 能滿足描述所有 Unicode 字符的需要了。
下面利用一些專用術語解釋一下 Java語言解決這個問題的基本方法。從 Java SE 5.0 開 始。碼點(code point) 是指與一個編碼表中的某個字符對應的代碼值。在 Unicode 標準中, 碼點採用十六進制書寫,並加上前綴 U+, 例如 U+0041 就是拉丁字母 A 的碼點。Unicode 的 碼點可以分成 17 個代碼級別(codeplane)。第一個代碼級別稱爲基本的多語言級別(basic multilingual plane), 碼點從 U+0000 到 U+FFFF, 其中包括經典的 Unicode 代碼;其餘的 16 個級別碼點從 U+10000 到 U+10FFFF, 其中包括一些輔助字符(supplementary character)。
UTF-16 編碼採用不同長度的編碼表示所有 Unicode 碼點。在基本的多語言級別中,每個 字符用 16 位表示,通常被稱爲代碼單元(code unit); 而輔助字符采用一對連續的代碼單元 進行編碼。這樣構成的編碼值落人基本的多語言級別中空閒的 2048字節內, 通常被稱爲替 代區域(surrogate area)
【U+D800 ~ U+DBFF 用於第一個代碼單元,U+DC00 ~ U+DFFF 用 於第二個代碼單元】。這樣設計十分巧妙,我們可以從中迅速地知道一個代碼單元是一個字 符的編碼,還是一個輔助字符的第一或第二部分。例如,⑪是八元數集(http://math.ucr.edu/ home/baez/octonions) 的一個數學符號,碼點爲 U+1D546, 編碼爲兩個代碼單元 U+D835 和 U+DD46。(關於編碼算法的具體描述見 http://en.wikipedia.org/wiki/UTF-l6 ) 。
在 Java中,char 類型描述了 UTF-16 編碼中的一個代碼單元。
我們強烈建議不要在程序中使用 char 類型,除非確實需要處理 UTF-16 代碼單元。最好 將字符串作爲抽象數據類型處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章