.NET Framework 內建並未提供繁簡轉換功能,常見做法有:呼叫 Windows API (`MLang`)、使用第三方開源庫 (如 `ChineseConverter`)、或引用現成的 `Encode.dll`。本文以原文提供的 `Encode.dll` 為例,說明整合步驟、代碼範例、注意事項,並提供現代化替代方案。
下載原文連結提供的 `Encode.dll` (位於專案 `bin/Debug` 目錄)。
using EncodeMy; // Encode.dll 的命名空間
public class ChineseConverter
{
private readonly EncodeRobert _converter = new EncodeRobert();
/// 簡體轉繁體
public string ToTraditional(string simplified)
{
if (string.IsNullOrEmpty(simplified)) return simplified;
return _converter.SCTCConvert(ConvertType.Simplified, ConvertType.Traditional, simplified);
}
/// 繁體轉簡體
public string ToSimplified(string traditional)
{
if (string.IsNullOrEmpty(traditional)) return traditional;
return _converter.SCTCConvert(ConvertType.Traditional, ConvertType.Simplified, traditional);
}
}
// 使用範例
protected void btnConvert_Click(object sender, EventArgs e)
{
var converter = new ChineseConverter();
txtResult.Text = converter.ToTraditional(txtSource.Text);
}
namespace EncodeMy
{
public enum ConvertType { Simplified, Traditional }
public class EncodeRobert
{
public string SCTCConvert(ConvertType from, ConvertType to, string input);
}
}
優點:開源、跨平台 (.NET Core/.NET 5+)、無非托管相依、支援詞彙級轉換、可自訂詞庫。
dotnet add package ChineseConverter
using ChineseConverter;
public class ModernChineseConverter
{
public string ToTraditional(string simplified) =>
ChineseConverter.Convert(simplified, ChineseConversionDirection.SimplifiedToTraditional);
public string ToSimplified(string traditional) =>
ChineseConverter.Convert(traditional, ChineseConversionDirection.TraditionalToSimplified);
}
// .NET 6+ 需安裝 ICU 全球化資料 (Linux: apt install libicu-dev)
using System.Globalization;
public class IcuChineseConverter
{
// 注意:CultureInfo 不直接提供繁簡轉換,需搭配 Transliterator (ICU)
// 目前 .NET 尚未完整暴露 Transliterator API,建議仍用 ChineseConverter 套件
}
using System.Runtime.InteropServices;
public class MlangConverter
{
[DllImport("mlang.dll", CharSet = CharSet.Unicode)]
private static extern int ConvertINetString(
ref uint lpdwMode,
uint dwEncoding,
[MarshalAs(UnmanagedType.LPWStr)] string lpSrcStr,
ref int lpcSrcLen,
[MarshalAs(UnmanagedType.LPWStr)] StringBuilder lpDstStr,
ref int lpcDstLen);
private const uint MLANGCODEPAGE_CP936 = 936; // GB2312
private const uint MLANGCODEPAGE_CP950 = 950; // Big5
private const uint MLANGCODEPAGE_UTF8 = 65001;
// 簡體(GB2312) -> 繁體(Big5)
public string ToTraditional(string input)
{
uint mode = 0;
int srcLen = input.Length;
var dst = new StringBuilder(srcLen * 2);
int dstLen = dst.Capacity;
// 需先轉碼至 GB2312 位元組,再用 mlang 轉 Big5,最後解碼
// 實作較複雜,略...
return input; // Placeholder
}
}
public static class ChineseHelper
{
private static readonly ChineseConverter _converter = new ChineseConverter(); // 或 EncodeRobert
public static string ToTraditional(string input) =>
string.IsNullOrEmpty(input) ? input : _converter.ToTraditional(input);
public static string ToSimplified(string input) =>
string.IsNullOrEmpty(input) ? input : _converter.ToSimplified(input);
}
// 頁面使用
lblResult.Text = ChineseHelper.ToTraditional(txtInput.Text);
// MVC Razor 擴充方法
public static class HtmlHelperExtensions
{
public static IHtmlContent ChineseConvert(this IHtmlHelper html, string text, bool toTraditional)
{
var converted = toTraditional ? ChineseHelper.ToTraditional(text) : ChineseHelper.ToSimplified(text);
return new HtmlString(HttpUtility.HtmlEncode(converted));
}
}
// View 使用
@Html.ChineseConvert(Model.Description, true)
// 使用 opencc-js (支援詞彙級、繁簡/異體字/地區用語)
import { Converter } from 'opencc-js';
const converter = new Converter({ from: 'cn', to: 'tw' }); // 簡體->台灣正體
document.getElementById('txtSource').addEventListener('input', function() {
document.getElementById('txtResult').value = converter(this.value);
});
| 問題 | 說明 | 解決 |
|---|---|---|
| Encode.dll 找不到 / 無法載入 | 目標平台不匹配 (x86/x64) 或缺少非托管相依 | 專案屬性 → Build → 勾選 "Prefer 32-bit" 或確保 DLL 架構一致 |
| 轉換結果不準確 (詞彙級) | 簡單字元對照表無法處理「鼠標/滑鼠」、「伺服器/服務器」等詞彙差異 | 改用 ChineseConverter 或 OpenCC 詞彙級引擎 |
| 異體字/地區用語 | 台灣/香港/大陸用字不同 (如「裏/裡」、「峰/峯」) | OpenCC 支援 `tw`/`hk`/`twp` 等地區配置 |
| 效能問題 (大量文字) | 逐字元轉換慢 | 使用詞彙級引擎、快取常用結果、或前端處理 |
| 部署至 Linux 容器失敗 | Encode.dll / mlang.dll 僅限 Windows | 改用 ChineseConverter (純 managed) 或 OpenCC (需安裝 libopencc) |
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 舊專案 (.NET Framework 4.x, 僅 Windows) | Encode.dll / ChineseConverter (NuGet) | 相容性好、整合快 |
| 新專案 (.NET Core / .NET 5+ / 跨平台) | ChineseConverter (NuGet) | 純 managed、跨平台、詞彙級、開源 |
| 高精度需求 (政府/出版/法律文件) | OpenCC (C++ 庫) + P/Invoke 或 .NET 移植版 | 業界標準、支援異體字/地區用語/自訂詞庫 |
| 前端即時預覽/編輯器 | opencc-js / hanzi-writer | 零後端延遲、使用者體驗佳 |
**核心建議**:新專務請直接採用 **ChineseConverter (NuGet)**,避免舊元件相依與跨平台問題;舊專案維護期可暫用 `Encode.dll`,但規劃遷移路徑。