用C#將簡體字轉為繁體字
Posted on 十二月 23, 2009 by 楊濬銘
最近在對岸下載的一些檔案,檔案名稱都怪怪的,打開後內容也都看不懂,那是為什麼呢,廢話!!那是簡體字,於是乎便動手寫了個工具可以進行檔名及內容的轉換,將簡體字轉為繁體字,ㄟㄟ...我知道你一定會問,這種程式不是很多了嗎幹嘛自己寫咧,一句話,沒辦法!!誰叫我熱愛程式呢,生於程式死於程式,凡是覺得不錯的總是要自己寫出來才過癮呀,哈哈,可別覺得我是怪人呀,好吧,不囉嗦聽我慢慢說明。
要進行簡體字轉繁體字,必須先了解何謂編碼,而編碼呢我相信因該是許多人困擾的東西,也是許多學生會問我的問題,其實很簡單,編碼簡單的來說就是對資料編排的定義方式不同,例如A、B兩家學校學校,在A學校中,由於學生較多所以班級數量也就相對較多,所以對於班級號碼的編碼方式採用2碼,而B學校由於學生不多所以相對班級較少,所以只需一碼來編排班級號碼,這時候如果兩個學校要交流可能就要進行編碼的轉換
例如:
A學校”010203”代表著三個班級,而B學校”123”代表著三個班級,所以兩者在溝通時就會需要進行編碼的轉換以免弄錯意思,而在轉換過程中有可能會有一些資料會遺失,這也是在轉換編碼時要注意的問題,在電腦的世界中其實編碼的部分也和現實生活差不多,因為有不同的資料編排的需求,所以就延伸出了許多的編碼,而這些編碼要進行轉換時,要如何進行呢?,會不會很難呢?,其實不用擔心,在微軟的.NET Framework中這些都幫你考慮好了,有現成的編碼類別可以進行編碼的轉換,所以使用起來相當輕鬆,聽我慢慢道來~
在電腦系統中有許許多多的編碼例如:ASCII、BIG5、GB18030、UTF-8…等等,而這些編碼在.NET中都有其對應的類別,例如當我希望能夠以ASCII來進行資料的處理時則可以採用System.Text.Encoding.ASCII,該屬性為ASCIIEncoding的實例,而UTF-8則可以採用System.Text.Encoding.UTF8,該屬性為UTF8Encoding的實例,其他的也類似,可以如果沒有對應的類別則可以使用CodePage或編碼名稱來取得對應的編碼,例如下列程式碼都可以取得BIG5的編碼Encoding的實體
System.Text.Encoding.GetEncoding(“BIG5”);
System.Text.Encoding.GetEncoding(950);
在使用這些編碼時,每個編碼方式都有所不同,類如ASCII是7位元編碼,編碼範圍是0x00-0x7F。其中ASCII編碼所包含的字元集包括阿拉伯數字、英文字母和標點符號等等。以下程式碼用ASCII編碼取得Unicode字串:
byte[]
buff1 = { 97, 98, 99 };
string
text1 = Encoding.ASCII.GetString(buff1);
Console.WriteLine(text1);
輸出的結果為
而如果用ASCII類別取得字串時超過編碼127的時候,在.NET中Unicode字串資料會被對應到問號(?)也就是編碼63,程式碼如下:
byte[]
buff2 = { 232, 233, 234 };
string
text2 = Encoding.ASCII.GetString(buff2);
Console.WriteLine(text2);
Console.WriteLine((int)text2[0]); //Unicode編碼63 (?)
Console.WriteLine((int)text2[1]); //Unicode編碼63 (?)
Console.WriteLine((int)text2[2]); //Unicode編碼63 (?)
輸出的結果為
所以如果採用其他編碼便可以解決這個問題例如編碼IBM437則有對ASCII表進行擴充,可以存放較多的資料,範圍是0~255,程式碼如下:
byte[]
buff1 = { 232, 233, 234 };
string
text1 = Encoding.GetEncoding("IBM437").GetString(buff1);
Console.WriteLine(text1);
Console.WriteLine((int)text1[0]);
Console.WriteLine((int)text1[1]);
Console.WriteLine((int)text1[2]);
輸出的結果為
如果想知道其他更多的編碼可以參考以下連結
http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx
接下來我們來進行實際的範例,該範例中希望能夠將簡體中文的”教程”兩個字轉為繁體中文的”教程”,首先我們先看到這兩個字在不同的編碼系統中是如何呈現的,首先我們先到到簡體中文系統,在簡體中文系統中教程的編碼為BDCCB3CC,如下圖所示:
但是同樣的編碼在繁體中文系統中則顯示"諒最",如下圖所示:
而繁體中文系統中教程的編碼為B1D0B57B,如下圖所示:
所以要進行簡繁轉換的關鍵,就是把編碼BDCCB3CC轉換成為 編碼B1D0B57B,那我們該如何將 BDCCB3CC轉換成為 B1D0B57B 呢?,首先我們先看到.NET中的String類別,由於在.NET中字串是採用Unicode編碼的,所以在.NET中用String類別保存資料如果編碼不對時則會需要進行編碼的轉換,例如剛從網路下載了一個名為”諒最.txt”的檔案,這個怪怪的名稱是什麼呢,實際上這個檔案在簡體中文的系統中是正常的顯示”教程.txt”這個檔名的,所以會有問題是因為編碼的需要轉換,那要進行編碼的轉換的話,則必須先取出編碼,以下我們就用實際的程式碼來說明,程式碼如下:
string
text = "諒最";
byte[]
buff = Encoding.Default.GetBytes(text);
Console.Write("編碼:");
for
(int i = 0; i < buff.Length; i++)
{
Console.Write("{0:X2} ", buff[i]);
}
Console.WriteLine();
輸出的結果為
在取出編碼後還需要進行編碼的轉換,例如以下的程式碼:
string
srctext = "諒最";
byte[]
srcbyte = Encoding.GetEncoding("BIG5").GetBytes(srctext);
string
dsttext = Encoding.GetEncoding("GB18030").GetString(srcbyte);
Console.WriteLine("轉換前:" + srctext);
Console.WriteLine("轉換後:" + dsttext);
輸出的結果為
這樣就大功告成啦!!,你看是不是很簡單呢!!,跟我一起宅下去就對啦~~




