unicode簡介:
unicode又稱為unicode character set,縮寫為ucs,意為字符集。編碼方式有utf-7,utf-8,utf-16,utf-32幾種,常用的是utf-8和utf-16。utf-8常用于web中,utf-16是windows和java采用的編碼方式。通常我們說unicode就是指utf-16。
本文主要講講utf-16和utf-8。
utf-16:
utf-16同時也稱為ucs-2編碼,采用兩個字節表示。最多可表示2^16=65536個符號。我們知道ascii碼用一個字節即可表示全部的英文字母,因此對于英文而言,utf-16稍顯浪費。
utf-8:
utf-8是一種變長unicode編碼,用1至4個字節表示。對于英文而言,用一個字節表示即可,此時utf-8編碼與ascii編碼是一模一樣的。
utf-16 be和utf-16 le:
be即big-endian,意味按高位到低位的順序存儲,那么le(little-endian)就是按低位到高位的順序存儲了。如果打開一個utf-16編碼的文件最先出現的是feff,則表明是用be方式存儲的。如果出現的是fffe則為le方式存儲。
bom:
在utf-16 be中用16進制表示為feff,轉換為二進制是11111110 11111111(左側為高位,右側為低位)。在utf-16 le中用16進制表現為fffe, 因此bom的存在就是為了區分文件是用be方式還是le方式存儲的。
在utf-8 be中bom用16進制表示為ef bb bf。
unicode轉化為utf-8:
utf-8的編碼規則很簡單,只有二條:
1)對于單字節的符號,字節的第一位設為0,后面7位為這個符號的ascii碼。因此對于英語字母,utf-8編碼和ascii碼是相同的。
2)對于n字節的符號(n>1),第一個字節的前n位都設為1,第n+1位設為0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。
Unicode符號范圍 | utf-8
(十六進制) |(二進制)
-------------------------+--------------------------------------
0000 0000 - 0000 007F | 0xxxxxxx
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
找到unicode符號對應的utf-8區間,將unicode符號轉換為二進制,最后一個二進制位開始,依次從后向前填入utf-8格式中的x,多出的位補0。
示例:
將utf-16 bom轉換為utf-8 bom,即將0xfeff轉換為utf-8 bom。
一)unicode編碼feff所在的范圍為0000 0800 - 0000 FFFF,因此其utf-8模板為1110xxxx 10xxxxxx 10xxxxxx,占用3個字節。
二)0x feff = 0b 1111 111011 111111,這里我是用python計算出來的,bin(0xfeff)
三)從最后一個二進制位開始,依次將每位填入utf-8模板中,多出位補0,得11101111 10111011 10111111,轉換為16進制為ef bb bf,用python計算hex(0b111011111011101110111111)可得
參考文章:
1.字符編碼筆記:ASCII,Unicode和UTF-8 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
2.程序員趣味讀物:談談Unicode編碼 http://www.pconline.com.cn/pcedu/empolder/gj/other/0505/616631.html
文章列表