利用漢字在 Unicode (或 GB2312) 編碼中的區位順序,將常用漢字按拼音首字母分區。輸入字串取首字元,判斷落於哪個區間,回傳對應大寫字母;非漢字 (英文/數字/符號) 直接轉大寫或歸類為 0。
public static class ChineseSpellHelper
{
///
/// 取得字串首字元的拼音首字母 (大寫);非漢字回傳原字元大寫或 "0"
///
public static string GetFirstSpell(string str)
{
if (string.IsNullOrEmpty(str)) return "0";
char c = str[0];
// 非漢字直接處理
if (c < 0x4E00 || c > 0x9FFF) // CJK Unified Ideographs 範圍
{
if (char.IsDigit(c)) return "0";
return char.ToUpper(c).ToString();
}
// 依 Unicode 碼位對應首字母區間 (簡化版,涵蓋常用漢字)
// 實際專案建議使用完整拼音資料庫或 NLP 庫
if (c < '吖') return char.ToUpper(c).ToString(); // 理論不會進入
else if (c < '八') return "A";
else if (c < '嚓') return "B";
else if (c < '咑') return "C";
else if (c < '妸') return "D";
else if (c < '發') return "E";
else if (c < '旮') return "F";
else if (c < '铪') return "G";
else if (c < '譏') return "H";
else if (c < '咔') return "J";
else if (c < '垃') return "K";
else if (c < '嘸') return "L";
else if (c < '拏') return "M";
else if (c < '噢') return "N";
else if (c < '妑') return "O";
else if (c < '七') return "P";
else if (c < '亽') return "Q";
else if (c < '仨') return "R";
else if (c < '他') return "S";
else if (c < '哇') return "T";
else if (c < '夕') return "W";
else if (c < '丫') return "X";
else if (c < '帀') return "Y";
else if (c < '咗') return "Z";
else return "0";
}
///
/// 取得整串字串的拼音首字母縮寫 (如 "中國人" -> "ZGR")
///
public static string GetSpellCode(string str)
{
if (string.IsNullOrEmpty(str)) return "";
var sb = new StringBuilder();
foreach (char c in str)
sb.Append(GetFirstSpell(c.ToString()));
return sb.ToString();
}
}
ChineseSpellHelper.GetFirstSpell("張"); // "Z"
ChineseSpellHelper.GetFirstSpell("A"); // "A"
ChineseSpellHelper.GetFirstSpell("9"); // "0"
ChineseSpellHelper.GetSpellCode("北京市"); // "BJS"
Windows.Globalization.PhoneticGenerator (UWP/WinUI 3)
private static readonly Dictionary FirstLetterMap = new()
{
{'中','Z'}, {'國','G'}, {'人','R'}, {'北','B'}, {'京','J'}, {'市','S'},
// ... 續增 20000+ 字元
};
public static char GetFirstLetter(char c)
=> FirstLetterMap.TryGetValue(c, out var letter) ? letter : char.IsDigit(c) ? '0' : char.ToUpper(c);
依專案需求在「零依賴簡易版」與「完整庫/對照表」間取捨。