JAVA’char編碼方式_UTF-16

 本文簡介:是關於JAVA中char數據類型的編碼方式_主要涉及Unicode,UTF-16.

關鍵字:JAVA,char,Unicode,UTF-16.

Unicode代碼單元:可用十六進制格式的編碼單元,從\u0000~\uFFFF 表示。

Unicode轉義序列——表示特殊字符 =>可以出現在“字符常量”“字符串”的引號內。轉義序列符\u還可以出現在字符常量或字符串的引號之外。

要想弄清楚char,就必須弄清楚Unicode編碼表。

設計JAVA的時候用的是Unicode編碼方式,用兩個字節的代碼寬度=>編碼=>世界上所以語言的字符。

十分遺憾的是,現在不可避免的事情發生了,Unicode字符超過了65536個,對此16位的char類型已經不能滿足表示所以Unicode字符的需要了。

那麼JAVA是如何解決這類問題的呢?

先引入一些小概念。

代碼點(code point):是指“編碼表”中的某個字符對應的“編碼”Unicode標準中,代碼點用十六進制書寫,並加前綴U+,例如U+0041表示字母A的代碼點。

Unicode的代碼點可分爲17個代碼級別(code plane)。第一個代碼級別 =>基本的多語言級別-basic multilingual plane,代碼點從U+0000~U+FFFF(其中包括一些經典的Unicode代碼),其餘的十六個附加的級別,代碼點從U+1 0000 ~ U+10 FFFF (其中包括一些輔助字符)

在JAVA中,char類型用UTF-16編碼描述一個代碼單元(字符)。是Unicode的一個使用方式。

UTF-16編碼採用不同長度的編碼表示所以Unicode代碼點。

用16個位表示=>Unicode中“基本的多語言基本”——代碼單元。(在基本的多語言基本中,從U+D800 ~ U+DFFF之間的區段是沒有使用的。因此可以用這一區段的值累對輔助字符進行編碼)

其他級別中,輔助字符采用一對連續的代碼單元進行編碼(16*2)。這樣構成的編碼值一定落入基本的多語言基本中空閒的2048字節內,稱替代區域。【U+D800~U+DBFF用於第一個單元,U+DC00~U+DFFF用於第二個代碼單元】——通過這樣巧妙的設計,我們可以非常清楚地知道,這個代碼單元是表示一個“字符”,還是屬於"輔助字符"中的第一部分/第二部分

UTF-16的編碼方法:

1、如果字符編碼U小於0x10000,也就是十進制的0到65535之內,則直接使用兩字節表示;

2、如果字符編碼U大於0x10000,由於UNICODE編碼範圍最大爲0x10FFFF,從0x10000到0x10FFFF之間 共有0xFFFFF個編碼,也就是需要20個bit就可以標示這些編碼。用U'表示從0-0xFFFFF之間的值,將其前 10 bit作爲高位和16 bit的數值0xD800進行 邏輯or 操作,將後10 bit作爲低位和0xDC00做 邏輯or 操作,這樣組成的 4個byte就構成了U的編碼。

範例: UTF-16 編碼程序

假設要將 U+64321 (16進位) 轉成 UTF-16 編碼. 因爲它超過 U+FFFF, 所以他必須編譯成32位元(4個byte)的格式,如下所示:

 

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