漢字轉為unicode編碼怎么實現?
"𠮷" 漢字轉成\ud842\udfb7是怎么實現?
\ud842\udfb7 怎么計算出來的是什么意思?
ASCII碼
英語字母標點符號等256個字符,一個字節儲存,取值0x00-0x7F;
UNICODE編碼
則是對ASCII碼的一個擴展,對所有文字的一個編碼映射,是一個字符集,為每個文字分配一個id。用0x000000-0x10FFFF 這個區間內的一個值映射各種文字中的一個文字或符號,所以無論是漢字還是什么其他符號,都是這樣一個值與文字對應。
UTF-8編碼
UTF-8是一種編碼規則,將Unicode的碼位轉換為字節編碼。UTF(Unicode Transformation Format).例如UTF-8,采用變字節長度進行編碼;大於2個字節時,如下表所示,第一個字節前面有幾個1,表示有幾個字節。X表示存儲數據的位數。UTF-8使用1~4字節為每個字符編碼:
·一個US-ASCIl字符只需1字節編碼(Unicode范圍由U+0000~U+007F)。
·帶有變音符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文等字母則需要2字節編碼(Unicode范圍由U+0080~U+07FF)。
·其他語言的字符(包括中日韓文字、東南亞文字、中東文字等)包含了大部分常用字,使用3字節編碼。
·其他極少使用的語言字符使用4字節編碼。
Unicode編碼(十六進制) |
UTF-8 字節流(二進制) |
000000-00007F |
0xxxxxxx |
000080-0007FF |
110xxxxx 10xxxxxx |
000800-00FFFF |
1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF |
11110xxx10xxxxxx10xxxxxx10xxxxxx |
采用UTF-8對unicode碼位進行編碼的舉例
「知」字的碼位 U+77E5 屬於第三行的范圍:
7 7 E 5
0111 0111 1110 0101 二進制的 77E5
--------------------------
0111 011111 100101 二進制的 77E5
1110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行)
11100111 10011111 10100101 代入模版
E 7 9 F A 5
UTF-16編碼
在上面的介紹中,提到了 Unicode 是一本很厚的字典,她將全世界所有的字符定義在一個集合里。這么多的字符不是一次性定義的,而是分區定義。每個區可以存放 65536 個(2^16)字符,稱為一個平面(plane)。目前,一共有 17 個(2^5)平面,也就是說,整個 Unicode 字符集的大小現在是 2^21。
最前面的 65536 個字符位,稱為基本平面(簡稱 BMP ),它的碼點范圍是從 0 到 2^16-1,寫成 16 進制就是從 U+0000 到 U+FFFF。所有最常見的字符都放在這個平面,這是 Unicode 最先定義和公布的一個平面。剩下的字符都放在輔助平面(簡稱 SMP ),碼點范圍從 U+010000 到 U+10FFFF。
基本了解了平面的概念后,再說回到 UTF-16。UTF-16 編碼介於 UTF-32 與 UTF-8 之間,同時結合了定長和變長兩種編碼方法的特點。它的編碼規則很簡單:基本平面的字符占用 2 個字節,輔助平面的字符占用 4 個字節。也就是說,UTF-16 的編碼長度要么是 2 個字節(U+0000 到 U+FFFF),要么是 4 個字節(U+010000 到 U+10FFFF)。那么問題來了,當我們遇到兩個字節時,到底是把這兩個字節當作一個字符還是與后面的兩個字節一起當作一個字符呢?
這里有一個很巧妙的地方,在基本平面內,從 U+D800 到 U+DFFF 是一個空段,即這些碼點不對應任何字符。因此,這個空段可以用來映射輔助平面的字符。
輔助平面的字符位共有 2^20 個,因此表示這些字符至少需要 20 個二進制位。UTF-16 將這 20 個二進制位分成兩半,前 10 位映射在 U+D800 到 U+DBFF,稱為高位(H),后 10 位映射在 U+DC00 到 U+DFFF,稱為低位(L)。這意味着,一個輔助平面的字符,被拆成兩個基本平面的字符表示。
因此,當我們遇到兩個字節,發現它的碼點在 U+D800 到 U+DBFF 之間,就可以斷定,緊跟在后面的兩個字節的碼點,應該在 U+DC00 到 U+DFFF 之間,這四個字節必須放在一起解讀。
接下來,以漢字"𠮷"為例,說明 UTF-16 編碼方式是如何工作的。漢字"𠮷"(古漢字,不是吉利的吉)的 Unicode 碼點為 0x20BB7,該碼點顯然超出了基本平面的范圍(0x0000 - 0xFFFF),因此需要使用四個字節表示。首先用 0x20BB7 - 0x10000 計算出超出的部分0x10BB7,然后將其用 20 個二進制位表示(不足前面補 0 ),結果為0001 0000 10 11 1011 0111。接着,將前 10 位映射到 U+D800 到 U+DBFF 之間,后 10 位映射到 U+DC00 到 U+DFFF 即可。U+D800 對應的二進制數為 1101100000000000,直接填充后面的 10 個二進制位即可,得到 1101100001000010,轉成 16 進制數則為 0xD842。同理U+DC00對應的二進制為1101110000000000,加上后10位的1101 1111 1011 0111低位為 0xDFB7。因此得出漢字"𠮷"的 UTF-16 編碼為 0xD842 0xDFB7。常用\u D842\uDFB7表示。
自己開發了一個股票智能分析軟件,功能很強大,需要的點擊下面的鏈接獲取: