利用 Unicode 編碼區塊特性:CJK 統一表意文字基本區塊範圍 U+4E00 (19968) ~ U+9FFF (40879),共 20902 字。將每個漢字的拼音首字母預計算存入字串查表,運行時通過 索引 = 字符碼 - 19968 直接 O(1) 定位。
///
/// 獲取字串的漢語拼音首字母代碼(僅大寫字母)
///
public static string ToChineseSpell(string strText)
{
if (string.IsNullOrEmpty(strText)) return strText;
var sb = new System.Text.StringBuilder();
foreach (char ch in strText)
{
// 英文字母直接大寫輸出
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
{
sb.Append(char.ToUpper(ch));
}
else
{
int index = ch - 19968; // Unicode 起始碼 19968 (0x4E00)
if (index >= 0 && index < strChineseFirstPY.Length)
sb.Append(strChineseFirstPY[index]);
// 非漢字字符(標點、數字等)直接忽略
}
}
return sb.ToString();
}
///
/// 20902 個漢字拼音首字母查表字串
/// Unicode 範圍:19968 (0x4E00) ~ 40869 (0x9FA5)
///
private static readonly string strChineseFirstPY =
"YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJ"
+ "HHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPC"
+ "BZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZ"
// ... (此處省略中間極長字串,完整長度應為 20902 字符)
+ "XY"; // 結尾片段
string 本質為 char[],str[index] 直接取字符,無額外分配index >= 0 && index < Length 防越界| 方案 | 時間複雜度 | 空間 | 備註 |
|---|---|---|---|
| 查表法 (本文) | O(N) | ~20 KB | 單次遍歷,無分支預測失敗 |
| 字典 | O(N) | ~200 KB+ | 哈希計算開銷大 |
| P/Invoke Windows API | O(N) | 極小 | 跨邊界調用慢,平台相關 |
| 第三方庫 | O(N) | 視庫而定 | 依賴外部,部署複雜 |
string input = "北京歡迎您 ABC 123";
string result = ToChineseSpell(input); // 輸出:BJHYN ABC
查表法以 20 KB 靜態字串 換取 極致查詢速度,是嵌入式、高頻調用、無外部依賴場景的最優選。代碼簡潔、零分配、易移植,堪稱「以空間換時間」的教科書級範例。