代碼點就是指javascript型的信息點而代碼單元指普遍的廣泛的jinmk 和gdp信息技術網
創新互聯于2013年開始,是專業互聯網技術服務公司,擁有項目成都網站制作、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元開州做網站,已為上家服務,為開州各地企業和個人服務,聯系電話:18980820575
說白了一個代碼點就是一個Unicode字符。代碼單元就是代碼點的集合。
字符視圖
要了解字符集標準,您必須能區分三種不同的字符視圖:
字符集(字符的抽象列表)。
作為帶標量值的“代碼點”的字符。
作為編碼數據的字符。
字符集(字符的抽象列表)
字符集是各種文字(包括拉丁文、西里爾文、中文、朝鮮語、日語、希伯來語和阿拉伯語)中所包含的字符的一個抽象列表,由一百多萬個字符組成。字符集還包括其他符號,例如音符。
Unicode 和 GB18030 標準都具有字符集。當某個標準添加了新字符時,為了保持對等,另一個標準也將添加這些字符。
作為帶標量值的“代碼點”的字符
注意 這第二個字符視圖只適用于 Unicode,而不適用于 GB18030。
字符集中的每個字符都被分配到一個“代碼點”。每個代碼點都有一個特定的數值,稱為標量值。該標量值通常用十六進制表示。
代碼點存在于“代碼空間”中。代碼空間由許多標量值組成,這些值被劃分在兩個平面中:
基本多語種平面(64k 大小)。
在 Unicode 中,此下平面中的值的十六進制表示位于 U+0000 到 U+FFFF 的范圍中。
輔助賀缺多語種平面(16 個 64k 大小的附加節)。
在 Unicode 中,此上平面中的值的十六進制表示位于 U+10000 到 U+10FFFF 的范圍中。
所有可能的標量值的完整代碼空間的大小為 17 * 64k(1,088,000 個可能值)。
作為編碼數據的字符
每個編碼形式將字符從字符集轉換為編碼數據。
在 GB18030 中,編碼數據直接從字符集派生:標量值(作為字符集和編碼數據之間的媒介)的概念只適用于 Unicode。
在 Unicode 中,通過向標量值應用某個算法來派生編碼數據隱遲。
Unicode 定義了三種字符編碼形式:
UTF-8
UTF-16
UTF-32
代碼點和代碼單元
在每種編碼形式禪攜辯中,代碼點被映射到一個或多個代碼單元。
注意 有關代碼點的概述,請參見上一節字符視圖。
“代碼單元”是各個編碼形式中的單個單元。代碼單元的大小等效于特定編碼的位數測量單位:
UTF-8 中的代碼單元由 8 位組成。
UTF-16 中的代碼單元由 16 位組成。
UTF-32 中的代碼單元由 32 位組成。
GB18030 中的代碼單元由 8 位組成。
每個代碼點中的代碼單元數
映射到代碼點所需的代碼單元數根據編碼形式而有所不同:
UTF-8
在 UTF-8 中,因為代碼單元較小的緣故,每個代碼點常常被映射到多個代碼單元。代碼點將被映射到一個、兩個、三個或四個代碼單元。
UTF-16
UTF-16 的代碼單元大小是 8 位代碼單元的兩倍。所以,標量值小于 U+10000 的代碼點被編碼到單個代碼單元中。
對于標量值大于或等于 U+10000 的代碼點,每個代碼點需要兩個代碼單元。在 UTF-16 中,這些代碼單元對有一個獨特的術語:“Unicode 代理對”。
注意 下面對 Unicode 代理對的支持進行了討論。
UTF-32
UTF-32 中使用的 32 位代碼單元足夠大,每個代碼點都可編碼為單個代碼單元。
GB18030
在 GB18030 中,因為代碼單元較小的緣故,每個代碼點常常被映射到多個代碼單元。代碼點將被映射到一個、兩個或四個代碼單元。
對 Unicode 代理對的支持
某些受 Unicode 支持的文字包含代碼點的標量值大于或等于 U+10000 的字符。在 UTF-16 中,通過使用代理對來對這些代碼點進行編碼。
正確處理 Unicode 代理對非常重要。例如,當您在使用 UTF-16 編碼的應用程序中處理文本時,如果要添加、刪除或選擇字符以進行剪切、復制或粘貼操作,文本光標必須將每個代碼點作為單個文本字符導航。
一、char 碼點和代碼單元
在Java Core 卷1中 對Char的描述如下
在設計Java時決定采用16位的Unicode字符集....(中間省略)... 現在16位的Char類型已經不能滿足描述所有Unicode字符的需要了。
Java為了解決這個問題的方法是使用蔽派碼點和代碼單元
代碼點(Code Point):在 Unicode 代碼空間中的一個值,取值 0x0 至 0x10FFFF,代表一個字符。
代碼單元(Code Unit):在具體編碼形式中的最小單位。比如 UTF-16 中一個 code unit 為 16 bits,UTF-8 中一個 code unit 為 8 bits。一個 code point 可能由一個或多個 code unit(s) 表示。在 U+10000 之前的 code point 可桐并譽以由一個 UTF-16 code unit 表示,U+10000 及之后的 code point 要由兩個 UTF-16 code units 表示
在Java中,char類型描述了UTF-16編碼中的一個代碼單元
碼點:就是某個任意字符在Unicode編碼表中對應的代碼值代碼單元:是在計算機中用來表示碼點的,大部分碼點只需要一個代碼單元表示,但是有一些是需要兩個代碼單元表示的。
不同碼點對應的代碼單元數量可能不同
下面實際操作體驗一番
" " 這個數學符號碼點 為U+1D546 在 Java中的代碼單元為 U+D835 和U+DD46
String word = "uD835uDD46";
System.out.println("字符為:"+word + " String.length(): "+ word.length());
打印結果如下(String.length()返回的是字符串代碼單元的長度)。
字符為: String.length(): 2
而且char類型無法放下這個符號
//char c = ' ';
String word2 = " ";
String firstUnit = Integer.toHexString(word.charAt(0));
String secondUnit = Integer.toHexString(word.charAt(1));
String codePoint = Integer.toHexString(word2.codePointAt(0));
System.out.println("第一個單元:" + firstUnit + " 第二個:" + secondUnit + " 碼點:" +codePoint);
打印結果
第一個單元:d835 第二個:dd46 碼點:1d546
二、UTF-16編碼方式
我們來思考UTF-16的設計思路:
我們知道Unicode的范圍為0x0~0x10FFFF
首先是0x0~0xFFFF這段區間,正好16位就可以表示,也兼容,兩全其美
那么超過這個區間的怎么辦呢?
也就是0xFFFF~0x10FFFF這段,我們先看這段區間有多少個碼位,
0x10FFFF-0xFFFF=0x100000,那么這個十六進制表示的十進制也就是:1048576個碼位
我們既然16位存不下,那肯定就是32位存咯,局段這個32能理解為什么不?不理解?是因為計算機只能以2的倍數拓展,如果不這么設計,就沒辦法解析。長短不一,不符合設計思路
32位來存這些數字,那么我們需要怎么存下呢,簡單的思考過后,大家認為應該分開存儲,也就是將32位分開前16位和后16位,每個16位各存一半
那么每一半存的就是1024(由來:1024*1024=1048576),1024代表的是2的10次冪,也就是10位二進制數
這樣就知道了,32位二進制數字中,前后16位中各存10位就夠用了,但是剩余的6位用來干什么呢?
和UTF-8的設計一樣,為了讓識別字符串變得容易(從文本的任意位置開始,均能區分一個字符的起始),這里是不是有點兒蒙?
舉個栗子:
假設:
0000 0001 代表A
0000 0010 代表B
0000 0001 ,0000 0001 代表 X
0000 0010 ,0000 0001 代表Z
那么 ABXZ就是
0000 0001 ,0000 0010 , 0000 0001 ,0000 0001 , 0000 0010,0000 0001
A B X Z
但是讓你從中間開始讀取,當你讀到X的時候,你不知道他是X還是 AB,這樣就很麻煩,你需要設置標志,來讓16位的數據的前8或后8不會和單個8位的重復
可以這樣設計:
0xxx xxxx 代表0~2^7
11xx xxxx ,10xx xxxx 代表其他的
這樣就能區分開了,當你讀到11開頭的,就代表他是16位的前8,10開頭代表16位的后8
歐了,有了這個思路,我們就知道怎么設計剛才的那個6位了,當然是通過這6位來區分這16位數字代表的位置
也就是UTF-16中,表示數據有單16位和雙16位(32位)兩種,那么我們設計成單16位和32位中的前16位和后16位這三個16位完全不會重復,那么我們就能隨時讀到一組16位,就能知道他是單16還是前16還是后16
舉個栗子:
根據上方信息,要求我們通過前6位來區分數據,那么前6位就是2^6=64,也就是開頭數字的區間
我們設定如下:
54開頭的為32位的前16位
55開頭的為32位的后16位
其他開頭的為單16位
這樣我們就能區分開這三個16位了,在讀取文檔中的任意位置,都能隨意區分出間隔咯
那么54開頭的數據區間是多少呢,就是1101 10xx xxxx xxxx,區間就是D800~DBFF
那么55開頭的數據區間是多少呢,就是1101 11xx xxxx xxxx,區間就是DC00~DFFF
為了配合UTF-16,Unicode中也將這兩個區間屏蔽掉,不允許分配任何字符
下方為比較官方的關于UTF-16的編碼詳解
參考文獻:
具體編碼方式
Unicode范圍U+10000~U+10FFFF:將Unicode值減去(0x10000),得到20bit長的值。再將Unicode分為高10位和低10位。UTF-16編碼的高位是2 Byte,高10位Unicode范圍為0-0x3FF,將Unicode值加上0XD800,得到高位代理(或稱為前導代理,存儲高位);低位也是2 Byte,低十位Unicode范圍一樣為0~0x3FF,將Unicode值加上0xDC00,得到低位代理(或稱為后尾代理,存儲低位)
根據上面的轉換方式,我們就能夠將Unicode碼根據UTF-16的編碼方式進行轉換。下面我們仍然通過兩個例子來看下:
U+0020,這個值的范圍在第一部分,即經過UTF-16編碼后,結果仍然為U+0020,在內存中的順序為00 20。
U+12345, 這個值的范圍在第二部分,因此需要先減去0x10000,得到0x02345,拆分成高10位00 0000 1000和低10位11 0100 0101。根據上面規則加上特定值后,高位代理值為D808,低位代理值為DF45,最終內存中的順序為D8 08 DF 45。
碼點是指一個編碼表畝銷中的某個字符對應的代碼值。Unicode的碼點分為17個代碼級別,第一個級別是基本的多語迅念游言級別,碼點高悉從U+0000——U+FFFF,其余的16個級別從U+10000——U+10FFFF,其中包括一些輔助字符。
本文題目:java碼點和代碼單元 java 碼點
轉載注明:http://vcdvsql.cn/article10/ddpicgo.html
成都網站建設公司_創新互聯,為您提供移動網站建設、網站內鏈、ChatGPT、面包屑導航、網站排名、電子商務
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯