-- Start
其實, 所謂的編碼就是字元和數字之間的映射, 我們把這個數字稱為代碼點或碼位(code point), 碼位採用16進位加上首碼U+來表示, 如:A的碼位是U+0041.
20世紀80年代, 人們在設計Unicode編碼的時候認為, 2個位元組16位65536個碼位足以將世界上所有語言的字元進行編碼, 碼位從 U+0000 到 U+FFFF.
隨著時間的發展, 在加入大量的中文, 日文和韓文之後, 不可避免的事情發生了, 65536個碼位已經不能滿足要求了, 所以人們將Unicode的碼位從
65536 個擴充到 1114111 個, 碼位從 U+0000 到 U+10FFFF.
人們又將這 1114111 個碼位劃分成17個平面(plane), 每個平麵包含 65536 個碼位, 每個平面的碼位範圍從U+xx0000到U+xxFFFF, 其中xx表示十六進位值從00到10,共計17個平面。
第一個平面稱為基本多文種平面(Basic Multilingual Plane, BMP),或第零平面(Plane 0)。 其他平面稱為輔助平面(Supplementary Planes)。
在基本多文種平面內, 從U+D800到U+DFFF之間的碼位區段是持續保留不映射到字元, 因此UTF-16巧妙的利用了這保留下來的碼位來對輔助平面內的字元進行編碼。
在UTF-16中, 輔助平面內的字元被編碼為一對16位元長的碼元, 稱之為代理對(surrogate pair), 第一部分稱為高位代理(high surrogate)或前置代理(lead surrogates),碼位從U+D800到U+DBFF. 第二部分稱為低位代理(low surrogate)或後尾代理(trail surrogates),
碼位從U+DC00到U+DFFF.
因此在Java中, 輔助平面內的字元需要一對char來表示, 如果你試圖通過一下代碼來定義一個char, 編譯器會給出錯誤提示.
char c = '\u10FFFF';
你也不要詫異, 為什麼我們可以把一個char型變數轉換成int型而不需要強制轉換, 事實上我們可以通過這種方式來查看它的碼位.
char c = '波';int i = c;System.out.println(Integer.toHexString(i));
---更多參見:Java 精萃
-- 聲 明:轉載請註明出處
-- Last Updated on 2012-04-25
-- Written by ShangBo on 2012-04-25
-- End