介紹一下java字符集和字符的編碼方式,java
首先要區分一下字符集和字符編碼.所謂的字符集 相似於unicode,GB2312,GBK,ASCII等等.由於一開始只有26個英文字母須要數組
編一下號.全部用下ASCII就夠了,可是隨着計算機的發展,有更多的文字須要在計算機中進行表現,包括拉丁文,日文,中文等等,所以各國有發展了編碼
各自國家文字的字符集. 而後爲了統一地球,把全部國家的文字集中起來,發展了unicode(廢話不少)spa
unicode一開始是用2個字節(16位)對應一個符號.這跟java中一個char類型的變量所佔用的字節數是相等的,沒什麼問題.可是後來unicode升級了.net
擴展到了20位(擴展爲0x0000-0x10ffff),這樣,一個char有時候就不能對應到一個unicode字符集中的一個符號了.代理
因此就用2個char來表示一個大於0xffff的數值在unicode字符集中所對應的符號.(假設說從0x0000-0xffff個數,每個對應一個符號,均可以用一個char來表示,code
那麼,數字0x10ff00所對應的符號就必須用2個char來表示,假設0x10ff00直接用2個char也就是32位來表示,即表示爲0x0010,0xff00,可是當讀取到0x0010時候,如何判斷這個數字是表明0x0010在unicode字符集中對應的一個符號,仍是表示0x10ff00數字的高16位,因此咱們須要一種編碼方式來解決這種歧義.因此這就是編碼方式的做用之一)blog
在java中char類型集採用的是utf-16的編碼方式.下面就對utf-16編碼方式進行一下介紹.unicode
先介紹一下幾個名詞: 1.代碼點(code point): 表示的是某個字符在unicode字符集中所對應的編號. 好比字符 'A' 對應的代碼點(code point)就是0x0041字符串
2. 代碼單元(code unit): 規定16位的存儲容量就是一個代碼單元.
Unicode代碼點能夠分紅17個代碼級別(code plane)。第一個代碼級別稱爲基本的多語言級別(basic multilingual plane),代碼點從0x0000到0xFFFF,其中包括了經典的Uncode代碼;其他16個附加級別,代碼點從0x10000帶0x10FFFF,其中包括了一些輔助字符(supplementary character)。
Unicode字符集基本平面BMP中的字符(從0x0000到0xFFFF,但必須除開0xD800~0xDFFF這一在Unicode字符集BMP中稱之爲代理碼點的部分(空閒部分) 0xD800到0xDBFF用於第一個代碼單元,0xDC00到0xDFFF用於第二個代碼單元),仍然是直接映射關係,亦即這部分字符的字符編號與字符編碼是等同的。
而在編碼0x10000~0x10FFFF區間內的字符,則用2個代碼單元標識.且每一個代碼單元的值都落在了0xD800-0xDFFF區間內(這樣就不會發生歧義)
假設字符X(未知數)的編碼在0xFFFF以外,那麼字符X有2個代碼單元 —— W1和W2。其中W1=110110yyyyyyyyyy(0xD800-0xDBFF),W2 = 110111xxxxxxxxxx(0xDC00-OxDFFF)。而後,將X的高10位分配給W1的低10位,將X的低10位分配給W2的低10位。這樣就能夠將20bits的代碼點X拆成兩個16bits的代碼單元。並且這兩個代碼點正好落在替代區域0xD800-0xDFFF中。
具體舉個例子:代碼點0x1D56B(一個整數集的算術符號Z)
0x1D56B= 0001 1101 0101 0110 1011
將0x1D56B的高10位0001 1101 01分配給W1的低10位組合成110110 0001 1101 01=0xD875
將0x1D56B的低10位01 0110 1011分配給W2的低10位組合成110111 01 0110 1011=0xDD6B
這樣代碼點0x1D56B採用UTF-16編碼方式,用2個連續的代碼單元0xD875和0xDD68表示出了。
因爲String內部使用的是char[]來表示字符串,因此String類也使用utf-16編碼方式存儲字符.
因此咱們使用Strinig類的CharAt(index)方法時要多加當心, 返回的char可能落在區間0xD800-0xDFFF中(若是字符串中含有除基本多語言級別以外的字符)
還有一些好比length()方法,只是返回底層char數組的長度,並不是實際字符的個數.(固然還有其餘一些方法,須要多注意).
參考:https://zhuanlan.zhihu.com/p/27417641
http://blog.csdn.net/fhx19900918/article/details/8135019