Unicode 是Unicode.org制定的編碼標準,目前得到了絕大部分操作系統和編程語言的支持。Unicode.org官方對Unicode的定義是: Unicode provides a unique number for every character。可見,Unicode所做的是為每個字符定義了一個相應的數字表示。比如,“a“的Unicode值是0x0061,“一”的 Unicde值是0x4E00,這是最簡單的情況,每個字符用2個字節表示。

        Unicode.org定義了百萬個以上的 字符,如果將所有的字符用統一的格式表示,需要的是4個字節。“a“的Unicode表示就會變成0x00000061,而“一“的Unicode值是 0x00004E00。實際上,這就是UTF32,Linux操作系統上所使用的Unicode方案。

        但是,仔細分析可 以發現,其實絕大部分字符只使用2個字節就可以表示了。英文的Unicode范圍是0x0000-0x007F,中文的Unicode范圍是0x4E00 -0x9F**,真正需要擴展到4個字節來表示的字符少之又少,所以有些系統直接使用2個字節來表示Unicode。比如Windows系統上, Unicode就是兩個字節的。對于那些需要4個字節才能表示的字符,使用一種代理的手法來擴展(其實就是在低兩個字節上做一個標記,表示這是一個代理, 需要連接上隨后的兩個字節,才能組成一個字符)。這樣的好處是大量的節約了存取空間,也提高了處理的速度。這種Unicode表示方法就是UTF16。一 般在Windows平臺上,提到Unicode,那就是指UTF16了。
        
        至于UTF16-LE和 UTF16-BE,與計算機的CPU構架有關。LE指Little Endian,而BE指Big Endian。關于這方面的信息,網上有很多相關的帖子。我們一般的X86系統都是Little Endian的,可以認為UTF16=UTF16-LE.

        由于對于歐洲和北美,實際上使用的編碼范圍在0x0000- 0x00FF之間,只需要一個字符就可以表示所有的字符。即使是使用UTF16來作為內存的存取方式,還是會帶來巨大的空間浪費,因此就有了UTF8的編 碼方式。這是一種很靈活的編碼,對于只需要1個字節的字符,就使用一個字節,對于中日韓等原本需要兩個字節才能表示的字符,則通過一個UTF16- UTF8的算法實現相互之間的轉換(一般需要3個字節才能表示),而對于需要4個字節才能表示的字符,UTF8可以擴展到6個字節每個字符。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 

        可以發現這和IP的分址算法很是相像。
        由于UTF8可以方便的轉換為UTF16和UTF32(不需要碼表,轉換算法可以在Unicode.org上找到C代碼)。而且UTF8在每個操作系統平臺上的實現都是一樣的,也不存在跨平臺的問題,所以UTF8成為跨平臺的Unicode很好的解決方案。當然,對于中文來說,由于每個字符需要3個字節才能表示,還是有點浪費的。
        
            
        



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=160958