用C#將簡體字轉為繁體字

Posted on 十二月 23, 2009 by 楊濬銘

最近在對岸下載的一些檔案,檔案名稱都怪怪的,打開後內容也都看不懂,那是為什麼呢,廢話!!那是簡體字,於是乎便動手寫了個工具可以進行檔名及內容的轉換,將簡體字轉為繁體字,ㄟㄟ...我知道你一定會問,這種程式不是很多了嗎幹嘛自己寫咧,一句話,沒辦法!!誰叫我熱愛程式呢,生於程式死於程式,凡是覺得不錯的總是要自己寫出來才過癮呀,哈哈,可別覺得我是怪人呀,好吧,不囉嗦聽我慢慢說明。 

要進行簡體字轉繁體字,必須先了解何謂編碼,而編碼呢我相信因該是許多人困擾的東西,也是許多學生會問我的問題,其實很簡單,編碼簡單的來說就是對資料編排的定義方式不同,例如AB兩家學校學校,在A學校中,由於學生較多所以班級數量也就相對較多,所以對於班級號碼的編碼方式採用2碼,而B學校由於學生不多所以相對班級較少,所以只需一碼來編排班級號碼,這時候如果兩個學校要交流可能就要進行編碼的轉換

例如:

A學校”010203”代表著三個班級,而B學校”123”代表著三個班級,所以兩者在溝通時就會需要進行編碼的轉換以免弄錯意思,而在轉換過程中有可能會有一些資料會遺失,這也是在轉換編碼時要注意的問題,在電腦的世界中其實編碼的部分也和現實生活差不多,因為有不同的資料編排的需求,所以就延伸出了許多的編碼,而這些編碼要進行轉換時,要如何進行呢?,會不會很難呢?,其實不用擔心,在微軟的.NET Framework中這些都幫你考慮好了,有現成的編碼類別可以進行編碼的轉換,所以使用起來相當輕鬆,聽我慢慢道來

在電腦系統中有許許多多的編碼例如:ASCIIBIG5GB18030UTF-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); 

 

在使用這些編碼時,每個編碼方式都有所不同,類如ASCII7位元編碼,編碼範圍是0x00-0x7F。其中ASCII編碼所包含的字元集包括阿拉伯數字、英文字母和標點符號等等。以下程式碼用ASCII編碼取得Unicode字串

            byte[] buff1 = { 97, 98, 99 };

            string text1 = Encoding.ASCII.GetString(buff1);

            Console.WriteLine(text1);

輸出的結果為


而如果用ASCII類別取得字串時超過編碼127的時候,在.NETUnicode字串資料會被對應到問號(?)也就是編碼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);

輸出的結果為


這樣就大功告成啦!!,你看是不是很簡單呢!!,跟我一起宅下去就對啦~~

最近文章
星期三 十二月 23, 2009
用C#將簡體字轉為繁體字

最近迴響