java 中 char代表一個字元? char 只有2個位元組能代表所有的 字元嗎?

語言: CN / TW / HK

一、眾所周知的char型別。

  • char 型別是一個單一的 16 位 Unicode 字元; =》 2個位元組
  • 最小值是**\u0000**(十進位制等效值為 0);
  • 最大值是**\uffff**(即為 65535);
  • char 資料型別可以儲存任何字元;
  • 例子:char letter = 'A';。

二、問題一,既然有範圍,那麼何以又能儲存任何字元呢? 矛盾對嗎。

bingo,你的猜想 沒錯,這裡確實有問題。char 並不能夠 儲存任何字元。 它 只能儲存 在  碼錶裡 (0-65535) 的字元。

我們來驗證一下。 既然 存的是碼錶。也就意味著  char 中 存的字元,最終 轉成  十進位制。也無非就是一個數字。

假如一個字元 碼錶中 對應的 十進位制 數字 為  65536。 看  char 是否能夠 表示,很明顯答案是否定的。程式碼如下:

三、問題二,那麼中華文化博大精深,一些不常用的漢字,我們又該如何表示勒?

答案是:String。

String 可以表示一個不常用的漢字。原因很簡單。

我們知道 String 其實底層是一個 char[] ,那麼既然一個char 無法 代表的 字元。 用多個char表示 不就好了。

好了,既然如此 ,不防我們來試驗一下。“𣡕”這個字 char 無法表示。它需要用兩個unicode編碼來表示“\uD84E\uDC55

如圖所示。字串長度 為 2,代表的 卻是一個漢字。

疑問再次產生。字串 中其實只有一個漢字啊,那不就是一個字元嗎,為什麼 長度 是 2 呢? 其實 字串的長度並不是字元的個數。而是 code units 的數量, 這裡一個unicode編碼代表一個 code unit  ,例子中 是 2個,所以長度為2 。 這樣就與我們 問題 2 描述的 初衷一致了,不是嗎。  看下原始碼,就更加鮮明勒。

/**
 * Returns the length of this string.
 * The length is equal to the number of <a href="Character.html#unicode">Unicode
 * code units</a> in the string.
 *
 * @return  the length of the sequence of characters represented by this
 *          object.
 */
public int length() {
    return value.length;
}

好,即便這樣能解釋的通,那麼 計算機 又是如何 解析 將 2個 code unit 解析為一個漢字的勒? 帶著這個問題,我們下篇部落格詳解。

四、總結

  • char 型別是一個單一的 16 位 Unicode 字元; =》 2個位元組
  • 最小值是**\u0000**(十進位制等效值為 0);
  • 最大值是**\uffff**(即為 65535);
  • char 資料型別可以儲存任意一個 code unit;
  • 例子:char letter = 'A' ;  char  letter1 = ‘\u6211’ ;。