- 論壇徽章:
- 0
|
轉(zhuǎn)自:
http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/80ac6b4ed1b7cec1d0c86a3e.html
Unicode是Unicode.org制定的編碼標準,目前得到了絕大部分操作系統(tǒng)和編程語言的支持。Unicode.org官方對Unicode的定義是:Unicode provides a unique number for everycharacter?梢姡琔nicode所做的是為每個字符定義了一個相應的數(shù)字表示。比如,“a“的Unicode值是0x0061, “一”的Unicde值是0x4E00,這是最簡單的情況,每個字符用2個字節(jié)表示。
Unicode.org定義了百萬個以上的字符,如果將所有的字符用統(tǒng)一的格式表示,需要的是4個字節(jié)!癮“的Unicode表示就會變成 0x00000061,而“一“的Unicode值是0x00004E00。實際上,這就是UTF32,Linux操作系統(tǒng)上所使用的Unicode方案。
但是,仔細分析可以發(fā)現(xiàn),其實絕大部分字符只使用2個字節(jié)就可以表示了。英文的Unicode范圍是0x0000-0x007F,中文的Unicode范圍是0x4E00-0x9F**,真正需要擴展到4個字節(jié)來表示的字符少之又少,所以有些系統(tǒng)直接使用2個字節(jié)來表示Unicode。比如Windows 系統(tǒng)上,Unicode就是兩個字節(jié)的。對于那些需要4個字節(jié)才能表示的字符,使用一種代理的手法來擴展(其實就是在低兩個字節(jié)上做一個標記,表示這是一個代理,需要連接上隨后的兩個字節(jié),才能組成一個字符)。這樣的好處是大量的節(jié)約了存取空間,也提高了處理的速度。這種Unicode表示方法就是 UTF16。一般在Windows平臺上,提到Unicode,那就是指UTF16了。
至于UTF16-LE和UTF16-BE,與計算機的CPU構(gòu)架有關。LE指Little Endian,而BE指BigEndian。關于這方面的信息,網(wǎng)上有很多相關的帖子。我們一般的X86系統(tǒng)都是LittleEndian的,可以認為 UTF16=UTF16-LE.
由于對于歐洲和北美,實際上使用的編碼范圍在0x0000-0x00FF之間,只需要一個字符就可以表示所有的字符。即使是使用UTF16來作為內(nèi)存的存取方式,還是會帶來巨大的空間浪費,因此就有了UTF8的編碼方式。這是一種很靈活的編碼,對于只需要1個字節(jié)的字符,就使用一個字節(jié),對于中日韓等原本需要兩個字節(jié)才能表示的字符,則通過一個UTF16-UTF8的算法實現(xiàn)相互之間的轉(zhuǎn)換(一般需要3個字節(jié)才能表示),而對于需要4個字節(jié)才能表示的字符,UTF8可以擴展到6個字節(jié)每個字符。UTF8使用的算法很有意思,大致映射關系如下:
UTF-32 UTF8
0x00000000 - 0x0000007F 0xxxxxxx
0x00000080 - 0x000007FF 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 - 0x7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
可以發(fā)現(xiàn)這和IP的分址算法很是相像。
由于UTF8可以方便的轉(zhuǎn)換為UTF16和UTF32(不需要碼表,轉(zhuǎn)換算法可以在Unicode.org上找到C代碼)。而且UTF8在每個操作系統(tǒng)平臺上的實現(xiàn)都是一樣的,也不存在跨平臺的問題,所以UTF8成為跨平臺的Unicode很好的解決方案。當然,對于中文來說,由于每個字符需要3個字節(jié)才能表示,還是有點浪費的。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u1/55468/showart_2162364.html |
|