| 方案 | 優點 | 缺點 | 推薦度 |
| Microsoft Visual Studio International Pack (官方) | 官方維護、支援多音字、筆畫、繁簡轉換 | 需安裝 MSI、僅 .NET Framework、文件較舊 | ★★★☆☆ (舊專案維護) |
| PinYinConverter (NuGet, 社群移植) | 免安裝、支援 .NET Core/5+、API 相容 | 非官方維護 | ★★★★☆ |
| Chinese.Pinyin (NuGet, 開源) | 純 managed、無依賴、支援多音字、效能佳 | 需評估授權 (MIT) | ★★★★★ (新專案首選) |
| 自建對照表 | 零依賴、完全可控 | 維護成本高、多音字難處理 | ★☆☆☆☆ |
方案一:官方 International Pack (適用 .NET Framework 4.x)
安裝步驟
- 下載 Microsoft Visual Studio International Feature Pack 2.0 (Vsintlpack2.msi)。
- 安裝後,參考組件:
C:\Program Files (x86)\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library\ChnCharInfo.dll
- 引用命名空間:
using Microsoft.International.Converters.PinYinConverter;
核心程式碼
public static class ChineseHelper
{
///
/// 取得全拼(每字取第一個讀音,去除聲調數字,首字母大寫)
///
public static string GetPinyin(string chinese)
{
if (string.IsNullOrEmpty(chinese)) return "";
var sb = new StringBuilder();
foreach (char c in chinese)
{
try
{
var cc = new ChineseChar(c);
// Pinyins 例:"gu4", "ying1" → 取第一個、去尾數、首字大寫
string py = cc.Pinyins[0];
py = py.Substring(0, py.Length - 1); // 移除聲調數字
sb.Append(char.ToUpper(py[0])).Append(py.Substring(1)).Append(' ');
}
catch
{
sb.Append(c).Append(' '); // 非漢字保留原字
}
}
return sb.ToString().Trim();
}
///
/// 取得首字母(大寫)
///
public static string GetFirstLetters(string chinese)
{
if (string.IsNullOrEmpty(chinese)) return "";
var sb = new StringBuilder();
foreach (char c in chinese)
{
try
{
var cc = new ChineseChar(c);
string py = cc.Pinyins[0];
sb.Append(char.ToUpper(py[0]));
}
catch
{
sb.Append(c);
}
}
return sb.ToString();
}
}
方案二:PinYinConverter NuGet (跨平台、免安裝)
// Package Manager Console
Install-Package PinYinConverter -Version 1.0.0
using PinYinConverter; // 命名空間相同
// API 與官方完全一致
var cc = new ChineseChar('中');
var py = cc.Pinyins[0]; // "zhong1"
方案三:Chinese.Pinyin (現代、高效、MIT)
Install-Package Chinese.Pinyin
using Chinese.Pinyin;
string text = "中國人";
// 全拼(空格分隔、首字大寫)
string pinyin = PinyinHelper.ConvertToPinyin(text, PinyinFormat.WithToneMarks); // "Zhōng Guó Rén"
// 無聲調
string plain = PinyinHelper.ConvertToPinyin(text, PinyinFormat.WithoutTone); // "Zhong Guo Ren"
// 首字母
string initials = PinyinHelper.GetInitials(text); // "ZGR"
多音字處理策略
- 預設取第一個讀音:`ChineseChar.Pinyins[0]`,覆蓋 90% 常用詞。
- 詞庫修正:結合 jieba.NET 分詞 + 自訂詞頻字典,針對「重慶/長行/發呆」等多音詞強制指定讀音。
- 使用者確認:關鍵業務(人名、地址)提供編輯介面讓使用者二次確認。
效能測試 (10 萬字串)
| 庫 | 耗時 (ms) | 記憶體 (MB) | 備註 |
| International Pack | ~1200 | ~45 | COM 互通開銷 |
| PinYinConverter | ~950 | ~38 | 純 managed 移植 |
| Chinese.Pinyin | ~320 | ~12 | 字典壓縮、無 GC 壓力 |
總結
- 舊專案 (.NET Framework) 已引用 International Pack → 繼續使用,封裝
ChineseHelper 統一介面。
- 新專案 / .NET Core / 跨平台 → 首選 Chinese.Pinyin,效能最佳、API 現代、MIT 授權無顧慮。
- 多音字無法 100% 機器解決,關鍵業務需人工複核機制。
- 上一篇文章: .NET 使用 MSMQ 訊息佇列實現異步處理與跨程序通訊
- 下一篇文章: ASP.NET AJAX 即時驗證使用者帳號是否存在(原生 JS + ASHX)
Copyright ©
程式碼之家 All Rights Reserved