首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 提取漢字拼音首字母 (支援英文數字兼容)

     編輯:關於C#

演算法原理

利用漢字在 Unicode (或 GB2312) 編碼中的區位順序,將常用漢字按拼音首字母分區。輸入字串取首字元,判斷落於哪個區間,回傳對應大寫字母;非漢字 (英文/數字/符號) 直接轉大寫或歸類為 0。

完整實作 (基於 GB2312 區位碼)


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"

局限性與改進方向

  • 上述區間基於**簡化 Unicode 碼位**,無法覆蓋所有漢字、多音字、生僻字。
  • 生產環境建議採用成熟庫:
    • PinYinConverter (Microsoft Internationalized Domain Names Kit)
    • Chinese.Pinyin (NuGet)
    • NPOI.HSSF.Util.Pinyin
    • 或呼叫 Windows Globalization API: Windows.Globalization.PhoneticGenerator (UWP/WinUI 3)
  • 若需高效能、離線、無依賴,可內嵌完整「漢字->拼音首字母」對照表 (約 2 萬常用字,~40KB),以 Dictionary<char, char> 查找,O(1) 極快。

完整對照表嵌入範例 (概念)


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);

依專案需求在「零依賴簡易版」與「完整庫/對照表」間取捨。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved