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

C# 取得漢字字串拼音首字母(GB2312 區位碼對照表法)

     編輯:關於C語言

原理說明

中文 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)。

現代跨平台替代方案 (.NET Core / 5+)

// NuGet: ChineseConverter
using ChineseConverter;
string spell = ChineseConverter.Convert("中國人民", ChineseConversionType.ToPinyinInitials); // ZGRM

或使用 NotoSansCJK 字型配合 HarfBuzz 進行文字分段與拼音轉換。

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