[轉]用C語言實現UCS-2和UTF-8之間的互相轉化

本文簡單介紹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

發佈了36 篇原創文章 · 獲贊 11 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章