**:
utf-16是unicode字符集的一種轉換方式,即把unicode的碼位轉換為16比特長的碼元序列,以用於資料儲存或傳遞。utf-16編碼規則如下:
2.2.1 從u+d800到u+dfff的碼位(**區)
因為unicode字符集的編碼值範圍為0-0x10ffff,而大於等於0x10000的輔助平面區的編碼值無法用2個位元組來表示,所以unicode標準規定:基本多語言平面內,u+d800..u+dfff的值不對應於任何字元,為**區。因此,utf-16利用保留下來的0xd800-0xdfff區段的碼位來對輔助平面的字元的碼位進行編碼。
但是在使用ucs-2的時代,u+d800..u+dfff內的值被占用,用於某些字元的對映。但只要不構成**對,許多utf-16編碼解碼還是能把這些不符合unicode標準的字元對映正確的辨識、轉換成合規的碼元. 按照unicode標準,這種碼元序列本來應算作編碼錯誤.
2.2.2 從u+0000至u+d7ff以及從u+e000至u+ffff的碼位
第乙個unicode平面(bmp),碼位從u+0000至u+ffff(除去**區),包含了最常用的字元。utf-16與ucs-2編碼在這個範圍內的碼位為單個16比特長的碼元,數值等價於對應的碼位。bmp中的這些碼位是僅有的碼位可以在ucs-2被表示。
2.2.3 從u+10000到u+10ffff的碼位
輔助平面(supplementary planes)中的碼位,大於等於0x10000,在utf-16中被編碼為一對16比特長的碼元(即32bit,4bytes),稱作 code units called a **對(surrogate pair),具體方法是:
ø 碼位減去0x10000, 得到的值的範圍為20比特長的0..0xfffff(因為unicode的最大碼位是0x10ffff,減去0x10000後,得到的最大值是0xfffff,所以肯定可以用20個二進位制位表示),寫成二進位制形式:yyyy yyyy yyxx ***x ***x。
ø 高位的10位元的值(值的範圍為0..0x3ff)被加上0xd800得到第乙個碼元或稱作高位**(high surrogate), 值的範圍是0xd800..0xdbff。由於高位**比低位**的值要小,所以為了避免混淆使用,unicode標準現在稱高位**為前導**(lead surrogates)。
ø 低位的10位元的值(值的範圍也是0..0x3ff)被加上0xdc00得到第二個碼元或稱作低位**(low surrogate), 現在值的範圍是0xdc00..0xdfff。 由於低位**比高位**的值要大,所以為了避免混淆使用,unicode標準現在稱低位**為後尾**(trail surrogates)。
ø 最終的utf-16(4位元組)的編碼(二進位制)就是:110110yyyyyyyyyy 110111*********x。
按照上述規則,unicode編碼0x10000-0x10ffff的utf-16編碼有兩個word,第乙個word的高6位是110110,第二個word的高6位是110111。可見,第乙個word的取值範圍(二進位制)是11011000 00000000到11011011 11111111,即0xd800-0xdbff。第二個word的取值範圍(二進位制)是11011100 00000000到11011111 11111111,即0xdc00-0xdfff。上面所說的從u+d800到u+dfff的碼位(**區),就是為了將乙個word(2位元組)的utf-16編碼與兩個word的utf-16編碼區分開來。
由於高位**、低位**、bmp中的有效字元的碼位,三者互不重疊,搜尋是簡單的: 乙個字元編碼的一部分不可能與另乙個字元編碼的不同部分相重疊。這意味著utf-16是自同步(self-synchronizing):可以通過僅檢查乙個碼元就可以判定給定字元的下乙個字元的起始碼元。 utf-8也有類似優點,但許多早期的編碼模式就不是這樣,必須從頭開始分析文字才能確定不同字元的碼元的邊界。
由於最常有的字元都在基本多文種平面中,許多軟體的處理**對的部分往往得不到充分的測試。這導致了一些長期的bug與潛在安全漏洞,甚至在廣為流行得到良好評價的應用軟體
結構體4位元組對齊規則的詳解
一 四位元組對齊的規則 c 中結構體變數的儲存為什麼有個4位元組對齊的規則,這裡是假設32位機器上,cpu在讀取記憶體資料的時候4位元組對齊會取得更快的速度 這是因為 1位元組8位,4位元組正好32位,而32位機器的暫存器,位址什麼的都是32位的,正好一次處理就完成。例如,下面的結構各成員空間分配情...
Mat和IplImage的4位元組對齊問題
首先說一下我發現這個神奇的問題的過程 我是在做產品的有效區域查詢時發現,好好的演算法有時候可以準確的提取產品有效區域,有時候會出問題,後來就將二值化影象畫素值列印出來,最後發現有時候其中會出現乙個 兩個或者三個205,開始一直以為是我在某個地方對影象資料進行了操作,後來將所有操作都給取消,還是經常 ...
float型資料與4位元組之間的轉換
在與上位機之間進行資料收發,要將float型資料轉換成位元組進行傳輸,根據float型資料的儲存方式可知 乙個float型資料占用4位元組儲存空間。因此可將乙個float型資料轉換成4個位元組資料進行傳輸。同樣在接收端也可以將4位元組轉換成float型資料進行顯示。本文給出了兩種轉換方法如下 inc...