2007年10月22日 星期一

簡繁互換

這個簡繁互換不是指 Encoding 的轉換, 而是簡體字轉繁體字的轉換.

C# 有兩種方法可以做到.

1. 使用 VB.StrConv , 但是該方法只是單純的單字對應, 所以轉出來的品質不佳, 但是速度快, 而且只要安裝 .NET Framework 就可以了.

2. 使用 MS Office Word , 該方法轉換的品質不錯 (ex: 光碟<->光盘), 尤其隨著安裝新版的 Word , 效果也就越好, 缺點當然是慢啦~~~ , 而且還要系統有安裝 Office Word 才可以.

Code as following:

using System.Reflection;
using Microsoft.VisualBasic;
using MSWord = Microsoft.Office.Interop.Word;
.....

 

/// <summary>
/// localeID refer : http://www.microsoft.com/globaldev/reference/win2k/setup/lcid.mspx
/// </summary>
/// <param name="str"></param>
/// <param name="IsChtToChs">true 表示繁轉簡, false 表示簡轉繁</param>
/// <param name="localeID">通常使用 2052 or 1028</param>
/// <returns></returns>
public string TranslateChinese(string str, bool IsChtToChs, int localeID)
{
if (IsChtToChs)
return Strings.StrConv(str, VbStrConv.SimplifiedChinese, localeID);
else
return Strings.StrConv(str, VbStrConv.TraditionalChinese, localeID);
}


/// <summary>
/// 使用 Word 轉換
/// </summary>
/// <param name="str"></param>
/// <param name="IsChtToChs">true 表示繁轉簡, false 表示簡轉繁</param>
/// <returns></returns>
public string TranslateChineseByWord(string str, bool IsChtToChs)
{
MSWord.Document doc =
new MSWord.Document();
doc.Content.Text = str;
if (IsChtToChs)
doc.Content.TCSCConverter(MSWord.WdTCSCConverterDirection.wdTCSCConverterDirectionTCSC,
true, true);
else
doc.Content.TCSCConverter(MSWord.WdTCSCConverterDirection.wdTCSCConverterDirectionSCTC, true, true);

string ret = doc.Content.Text;
object saveChanges = false;
object originalFormat = Missing.Value;
object routeDocument = Missing.Value;
doc.Close(
ref saveChanges, ref originalFormat, ref routeDocument);
return ret;
}
 
後記:
經過 Sean 大人提點, 還有一些額外資訊:
1. 這個也可以做半形字轉全形字, 或全形字轉半形,

半形轉全形:// localeID = 1041 是日文,這樣才能轉日文的全半形
string new_str = Microsoft.VisualBasic.Strings.StrConv(str, VbStrConv.Wide, 1041);

2. Strings.StrConv 底層事實上是呼叫 Windows API : LCMapString , CSharp 宣告如下,
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
static extern int LCMapString(uint Locale, uint dwMapFlags, string lpSrcStr, int cchSrc, StringBuilder lpDestStr, int cchDest);

所以也可以直接採用 LCMapString 來達成歐, 不過 code 更多更雜, 還是 Strings.StrConv 比較容易懂.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo

0 意見: