WindowsPhone的中文GB2312、GBK編碼與Unicode相互轉換

l_serein發表於2012-12-13

網上有高人做的GB2312與Unicode相互轉換的類或者程式集,大家去找找看。但是GB2312是比較老的標準,覆蓋漢字6763個和非漢字圖形字元682個。不是太夠用,只能用GBK(覆蓋漢字21003個、符號883個)。但找了老半天,網上沒有現成的GBK與Unicode相互轉換的程式集。遂,只能自己寫了,現無私分享給大家。

思路:首先明確一點:Unicode只相容ASCII碼。所以,沒有任何演算法函式能表示GBK和Unicode的相互關係。那怎麼辦嘞?作業系統不是可以轉換麼?它是用得什麼辦法。就是最蛋疼的查表法。說的明白一點GBK轉Unicode就是用陣列的下標表示GBK的編碼,用陣列的值表示Unicode的編碼。這就一一對應了。反之Unicode轉GBK亦然,大家自己去思考。

 

  一.GBK編碼是雙位元組(16bit),也就是說能表示2的16次方(65535)個編碼,而GBK的所覆蓋的字元只有21886。做簡單的方法就是弄個65535大小的陣列,其中零零散散地分佈著21886個有效GBK字元編碼,這太浪費資源了。需進行適當優化。

  接下來,請看,GBK中第一個中文字元編碼為十六進位制0x8140,最後一個編碼為0xFEFE。0xFEFE-0x8140+0x0001=0x7DBF=32191。好了,縮減了區間,大約就是大小為32191的陣列零零散散的分佈著21886個有效GBK字元編碼。所需空間減少了一半。但是還浪費了大約10000左右的空間,但是沒辦法了GBK編碼太零散了。優化到這一步GBK轉Unicode編碼就完啦。

  二.Unicode編碼也是雙位元組,首先,Unicode編碼只相容ASCII編碼,與其他編碼完全不相容。且,Unicode編碼中把中文簡體、繁體、日語、韓語列在同一大塊區域。沒有規律。完全找不到Unicode中文字元和GBK中文字元之間的函式對映。遂,也只能用查表法。

  最簡單的像上文那樣弄個大小為65535的陣列,當然也是浪費空間,也需要優化。GBK中的那些中文字元零散地分佈在Unicode編碼中6大塊區域

。分別為

  //0x00A4--0x0451    942   個編碼位零散分佈著157 個Unicode編碼的中文字元
  //0x2010--0x2642    1587 個編碼位零散分佈著289 個Unicode編碼的中文字元
  //0x3000--0x33D5    982   個編碼位零散分佈著270 個Unicode編碼的中文字元
  //0x4E00--0x9FA5    20902個編碼位零散分佈著20902個Unicode編碼的中文字元
  //0xE7C7--0xE864    158   個編碼位零散分佈著95 個Unicode編碼的中文字元
  //0xF92C--0xFFE5     1722 個編碼位零散分佈著173 個Unicode編碼的中文字元

大家自己計算一下,這樣一優化下來,只需要一個大小為26293的陣列零散地分佈著21886個有效中文字元。

 

下載: GBK與Unicode互換

檔案在上面的連結裡,大家要是想拿去專案中用的話,那需要注意GBKToUnicode.txt和UnicodeToGBK.txt的路徑。

還有一點,我的程式碼是在開發WindowsPhone的基礎上寫的。其中載入檔案的程式碼在其他平臺不適用。

貌似轉換效能也不太好,以後在優化。

至於說到GB2312與Unicode之間的相互轉換,GBK編碼向下相容GB2312編碼。

相關文章