utf8的編碼算法
作者:轉載 轉貼自:轉載 點擊數:827 文章錄入: zhaizl
例如字符"漢"的unicode是6C49,把這個unicode字符表示為一個大整數,然后轉變成多字節編碼110110001001001:
觀察這個整數的二進制碼序列(110,110001,001001)
從后往前取
如果這個二進制序列只有后7位(小于128,也就是ascii字符)則直接取后7位二進制數形成一個utf8字符。
上面的字符“漢”二進制序列大于7位,所以取后6位(1001001),加10形成一個utf8字節(10 001001 ,16進制89)。
剩下的二進制序列(110,110001)從后向前取6位,加10形成一個utf8字節(10 110001,16進制B1)。
剩下的二進制序列(110)從后向前取6位,由于不足6位,將這個數和1110000相或,得到字符11100110,16進制E6
最后,就得到了utf8編碼,16進制表示為E6B189
解讀UTF8編碼
2007-01-19 10:40
在網絡中有很多地方都有采用UTF8編碼,由于要編寫與郵件服務端有關的程序,而郵件服務端有些地方用到了UTF8編碼,所以對它有了初步的認識!
它其實和Unicode是同類,就是在編碼方式上不同! 首先UTF8編碼后的大小是不一定,不像Unicode編碼后的大小是一樣的! 我們先來看Unicode的編碼:一個英文字母 “a” 和 一個漢字 “好”,編碼后都是占用的空間大小是一樣的,都是兩個字節!
而UTF8編碼:一個英文字母“a” 和 一個漢字 “好”,編碼后占用的空間大小就不樣了,前者是一個字節,后者是三個字節!
現在就讓我們來看看UTF8編碼的原理吧: 因為一個字母還有一些鍵盤上的符號加起來只用二進制七位就可以表示出來,而一個字節就是八位,所以UTF8就用一個字節來表式字母和一些鍵盤上的符號。然而當我們拿到被編碼后的一個字節后怎么知道它的組成?它有可能是英文字母的一個字節,也有可能是漢字的三個字節中的一個字節!所以,UTF8是有標志位的!
當要表示的內容是 7位 的時候就用一個字節:0******* 第一個0為標志位,剩下的空間正好可以表示ASCII 0-127 的內容。
當要表示的內容在 8 到 11 位的時候就用兩個字節:110***** 10****** 第一個字節的110和第二個字節的10為標志位。
當要表示的內容在 12 到 16 位的時候就用三個字節:1110***** 10****** 10****** 和上面一樣,第一個字節的1110和第二、三個字節的10都是標志位,剩下的空間正好可以表示漢字。
以此類推: 四個字節:11110**** 10****** 10****** 10****** 五個字節:111110*** 10****** 10****** 10****** 10****** 六個字節:1111110** 10****** 10****** 10****** 10****** 10****** ............................................. ..............................................
明白了沒有? 編碼的方法是從低位到高位
現在就讓我們來看看實例吧!
紅色為標志位 其它著色為了顯示其,編碼后的位置
Unicode十六進制
|
Unicode二進制
|
UTF8二進制
|
UTF8十六進制
|
UTF8字節數
|
B
|
00001011
|
00001010
|
B
|
1
|
9D
|
00010011101
|
11000010 10011101
|
C2 9D
|
2
|
A89E
|
10101000 10011110
|
11101010 10100010 10011110
|
EA A2 9E
|
3
|
|