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