中文 Windows 內碼預設為 GB2312(雙位元組)。每個漢字佔 2 位元組,依區位碼範圍對應拼音首字母。本方法針對簡體中文環境,透過 Encoding.Default(系統預設 ANSI 編碼)取得位元組陣列,計算區位碼並查表。
using System;
using System.Text;
public static class ChineseSpellHelper
{
///
/// 取得漢字字串的拼音首字母大寫串聯(非漢字保留原字元)。
///
public static string GetFirstSpell(string chineseStr)
{
if (string.IsNullOrEmpty(chineseStr)) return string.Empty;
var sb = new StringBuilder(chineseStr.Length);
byte[] bytes = Encoding.Default.GetBytes(chineseStr); // 系統預設編碼 (GB2312/CP936)
for (int i = 0; i < bytes.Length; )
{
if (bytes[i] < 0x80) // ASCII 單位元組字元
{
sb.Append((char)bytes[i]);
i++;
}
else if (i + 1 < bytes.Length) // 雙位元組漢字
{
int zone = bytes[i];
int pos = bytes[i + 1];
int gbCode = zone * 256 + pos; // 區位碼數值
sb.Append(GetInitial(gbCode));
i += 2;
}
else // 殘缺位元組
{
i++;
}
}
return sb.ToString();
}
private static char GetInitial(int gbCode)
{
// GB2312 一級漢字首字母區間表(十進位)
if (gbCode >= 45217 && gbCode <= 45252) return 'A';
if (gbCode >= 45253 && gbCode <= 45760) return 'B';
if (gbCode >= 45761 && gbCode <= 46317) return 'C';
if (gbCode >= 46318 && gbCode <= 46825) return 'D';
if (gbCode >= 46826 && gbCode <= 47009) return 'E';
if (gbCode >= 47010 && gbCode <= 47296) return 'F';
if (gbCode >= 47297 && gbCode <= 47613) return 'G';
if (gbCode >= 47614 && gbCode <= 48118) return 'H';
if (gbCode >= 48119 && gbCode <= 49061) return 'J';
if (gbCode >= 49062 && gbCode <= 49323) return 'K';
if (gbCode >= 49324 && gbCode <= 49895) return 'L';
if (gbCode >= 49896 && gbCode <= 50370) return 'M';
if (gbCode >= 50371 && gbCode <= 50613) return 'N';
if (gbCode >= 50614 && gbCode <= 50621) return 'O';
if (gbCode >= 50622 && gbCode <= 50905) return 'P';
if (gbCode >= 50906 && gbCode <= 51386) return 'Q';
if (gbCode >= 51387 && gbCode <= 51445) return 'R';
if (gbCode >= 51446 && gbCode <= 52217) return 'S';
if (gbCode >= 52218 && gbCode <= 52697) return 'T';
if (gbCode >= 52698 && gbCode <= 52979) return 'W';
if (gbCode >= 52980 && gbCode <= 53640) return 'X';
if (gbCode >= 53689 && gbCode <= 54480) return 'Y';
if (gbCode >= 54481 && gbCode <= 55289) return 'Z';
return '?'; // 非標準漢字或符號
}
}
string input = "中國人民";
string spell = ChineseSpellHelper.GetFirstSpell(input);
Console.WriteLine(spell); // 輸出: ZGRM
| 限制 | 說明 | 改進建議 |
|---|---|---|
| 僅支援 GB2312/CP936 | 繁體中文 (Big5) 或 Unicode 環境無效 | 改用 Encoding.GetEncoding("GB2312") 明確指定,或引入 Microsoft.International.Converters.PinYinConverter (WinForms) / ChineseConverter (NuGet) 支援 Unicode。 |
| 多音字無法處理 | 如「長」只能對應 C (cháng) 或 Z (zhǎng) | 需詞典/語料庫語境判斷,屬 NLP 範疇。 |
| 擴展漢字 (二級/生僻字) 缺漏 | 表僅含一級常用漢字 (3755 字) | 補充二級漢字區間 (45217~55289 以外範圍)。 |
| 效能 | 逐字轉換,極長字串可優化 | 預先建立 Dictionary 或陣列查表 O(1)。 |
// NuGet: ChineseConverter
using ChineseConverter;
string spell = ChineseConverter.Convert("中國人民", ChineseConversionType.ToPinyinInitials); // ZGRM
或使用 NotoSansCJK 字型配合 HarfBuzz 進行文字分段與拼音轉換。