本文簡單介紹UCS,UNICODE和UTF-8,並利用C語言實現了UTF-8與UCS2之間的互相轉化。
1.什麼是UCS和ISO10646?
國際標準ISO10646定義了通用字符集(Universal Character Set, UCS).
UCS是所有其它字符集標準的一個超集,它保證也其它字符集雙向兼容,即編碼間相互轉換不會丟失任何信息。UCS字符集U+0000到U+007F與
US-ASCII是一致的。
2.什麼是UNICODE
歷史上, 有兩個獨立的, 創立單一字符集的嘗試.
一個是國際標準化組織(ISO)的 ISO 10646 項目, 另一個是由(一開始大多是美國的)多語言軟件製造商組成的協會組織的 Unicode
項目. 幸運的是, 1991年前後, 兩個項目的參與者都認識到, 世界不需要兩個不同的單一字符集. 它們合併雙方的工作成果,
併爲創立一個單一編碼表而協同工作. 兩個項目仍都存在並獨立地公佈各自的標準, 但 Unicode 協會和 ISO/IEC JTC1/SC2
都同意保持 Unicode 和 ISO 10646 標準的碼錶兼容, 並緊密地共同調整任何未來的擴展.
3.什麼是UTF-8(一種傳送和存儲格式)
UCS和UNICODE爲每個字符分配了一個對應的整數,但並沒有明確說明其實現機制.故存在多種編碼方式,其中以兩個字節和四個字節來存儲一個字符的
方法分別叫UCS-2,
UCS-4,要將一個ASCII文件轉換成一個UCS-2文件只要在每個字節前加一個字節0X00,轉換成UCS-4只要在每個字節前加三個0X00。
而internet上大量的信息是以ASCII碼存在的,如果都用兩個字節來存儲將浪費大量的資源,同時Unix和Linux下使用USC-2和USC-4會導致嚴重問題,於是出現了UTF-8(定義於ISO10646-1).
UTF-8(UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.)
UNICODE(UCS)和UTF-8的對應關係。
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
在多字節串中,第一個字節的開頭‘1’的數目就是整個串中字節的數目.
下面舉UCS-2與UTF-8的對應關係,並利用C語言實現之間的互相轉化。
-----------------------------------------------------------------------------------------------------------
| UCS2 | UTF-8 |
|----------------------------------------------------------------------------------------------------------
| | code | 1st Byte | 2nd byte | 3rd Byte |
|--------------------------------------------------------------------------------------------------------
| 000000000aaaaaaa | 0000 - 007F | 0aaaaaaa | | |
|--------------------------------------------------------------------------------------------------------
| 00000bbbbbaaaaaa | 0080 - 07FF | 110bbbbb | 10aaaaaa | |
|--------------------------------------------------------------------------------------------------------
| ccccbbbbbbaaaaaa | 0800 - FFFF | 1110cccc | 10bbbbbb | 10aaaaaa |
|--------------------------------------------------------------------------------------------------------
在這兒我只實現了單個字符的轉換,串的轉換也是一樣的道理。
1,把一個UTF-8字符轉換成一個UCS-2字符。
如果轉換成功返回1,如果UTF-8字符是一個unrecognized字符,則返回0,且存一個blackbox(U+22e0)到ucs2_code_ptr中。
2,把一個UCS-2字符轉換成UTF-8字符。函數返回轉換成UTF-8的長度(字節1 -- 3),如果目標指針爲空,返回0。
字符串間的轉換也是一樣的。
___________________________________________________________________________________
全文完
URL: http://www.wangchao.net.cn/bbsdetail_34579.html