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

ASP.NET 中文轉拼音與首字母完整實作(含 GB2312 映射表)

     編輯:ASP.NET 基礎

功能展示頁面 (Default.aspx)

簡單的 Web Form,包含輸入框、轉換按鈕、結果標籤:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head runat="server">
    <title>漢字轉換拼音首字母</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            輸入要轉換的漢字<br /><br />
            <asp:TextBox ID="txtChn" runat="server"></asp:TextBox>
            <asp:Button ID="btnGo" runat="server" OnClick="btnGo_Click" Text="轉 換" /><br /><br />
            <asp:Label ID="lbPinyin" runat="server" Font-Bold="True" Font-Size="14pt" ForeColor="#C00000"></asp:Label>
        </div>
    </form>
</body>
</html>

後台邏輯 (Default.aspx.cs)

protected void Page_Load(object sender, EventArgs e) { }

protected void btnGo_Click(object sender, EventArgs e)
{
    if (!string.IsNullOrWhiteSpace(txtChn.Text))
    {
        lbPinyin.Text = "首字母是:" + StrToPinyin.GetChineseSpell(txtChn.Text) 
                      + "<br>拼音是:" + ConvertHzToPz_Gb2312.Convert(txtChn.Text);
    }
}

核心類別一:StrToPinyin — 取得首字母

採用靜態字串陣列映射表,每筆資料首字為拼音大寫字母,後接該字母對應的所有漢字。查找時遍歷陣列,找到包含目標字元的字串,取其首字元即為首字母。

映射表結構節錄

private static string[] strChineseCharList = 
{
    "A阿啊锕嗄厑哎哀唉埃挨溾锿鎄啀捱皚凒溰嘊敳皚癌毐昹嗳矮藹躷噯藹譪霭靄艾伌愛砹硋隘嗌塧嫒愛礙暧瑷僾壒嬡懓薆曖璦鴱皧瞹馤鑀鱫安侒峖桉氨庵谙萻腤鹌蓭誝鞌鞍盦馣鮟盫韽啽雸垵",
    "A俺唵埯铵隌揞罯銨犴岸按荌案胺豻堓婩暗貋儑錌黯骯岇昂昻枊盎醠凹坳垇柪軪爊敖厫隞嗷嗸嶅廒滶獒獓遨熬璈蔜翱聱螯翶謷翺鳌鏖鰲鷔鼇芺襖媪镺襖岙扷岰傲奡奧嫯慠骜奧嶴澳懊擙謸鏊",
    "B八仈巴叭扒朳玐吧夿岜芭疤哵捌笆粑紦羓蚆釟豝鲃魞叐犮抜坺妭拔茇炦癹胈釛菝詙跋軷魃把靶壩弝爸垻罷鲅鮁覇矲霸壩灞欛挀掰白百佰柏栢捭竡粨擺擺襬呗拝敗拜唄敗稗粺鞁薭贁兡瓸扳",
    // ... 後續包含 B、C、D ... 至 Z 全部拼音分區,總計超過 400 組映射字串
};

GetChineseSpell 方法

public static string GetChineseSpell(string strText)
{
    if (string.IsNullOrEmpty(strText)) return strText;

    StringBuilder sb = new StringBuilder();
    foreach (char c in strText)
    {
        // 英文字母直接大寫輸出
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
        {
            sb.Append(char.ToUpper(c));
        }
        // Unicode 範圍 19968~40869 為常用漢字區
        else if ((int)c >= 19968 && (int)c <= 40869)
        {
            foreach (string list in strChineseCharList)
            {
                if (list.IndexOf(c) > 0) // 索引 0 為拼音字母
                {
                    sb.Append(list[0]);
                    break;
                }
            }
        }
        // 非漢字、非字母字元直接忽略
    }
    return sb.ToString();
}

核心類別二:ConvertHzToPz_Gb2312 — 完整拼音轉換 (GB2312 編碼對照)

依據 GB2312 區位碼規則 實作:

  • 01-09 區:特殊符號
  • 16-55 區:一級漢字(按拼音排序)
  • 56-87 區:二級漢字(按部首/筆畫排序)
  • 每字兩位元組:高位 = 區號 + 0xA0,低位 = 位號 + 0xA0。例如「啊」位於 16-01,編碼 0xB0A1。

映射表結構 (_Allhz)

private static readonly string[][] _Allhz = new string[][]
{
    new string[]{"A","啊阿呵吖嗄腌锕錒"},
    new string[]{"Ai","愛矮挨哎礙癌艾唉哀藹隘埃皚呆嗌嫒瑷暧捱砹嗳锿霭乂乃伌僾儗凒剀剴叆呃呝啀嘊噫噯堨塧壒奇娭娾嬡嵦愛懓懝敱敳昹曖欬欸毐溰溾濭烠焥璦皚皧瞹硋磑礙絠薆藹諰譪譺賹躷醷鎄鑀閡閡阨阸隑靄靉餲馤騃鯦鱫鴱崖"},
    new string[]{"An","按安暗岸俺案鞍氨胺廠廣庵揞犴铵桉谙鹌埯黯侒儑匼厈咹唵啽垵垾堓婩媕屽峖干晻洝玵痷盒盦盫碪罯腤荌菴萻葊蓭裺誝諳豻貋遃鉗銨錌鉗闇陰隂隌雸鞌韽頇頞顸馣鮟鴳鵪鶕"},
    // ... 後續包含 Ang、Ao、Ba、Bai ... 至 Zu、Zuan、Zui、Zun、Zuo 完整對照表
};

Convert 方法邏輯

public static string Convert(string str)
{
    if (str == null) return null;
    Encoding gb2312 = Encoding.GetEncoding("GB2312");
    if (gb2312 == null) throw new ArgumentException("找不到編碼集 GB2312");

    StringBuilder result = new StringBuilder();
    byte[] bytes = new byte[2];

    foreach (char c in str.ToCharArray())
    {
        bytes = gb2312.GetBytes(c.ToString());
        if (bytes.Length == 1) // ASCII 字元直接保留
        {
            result.Append(c);
            continue;
        }

        int zone = bytes[0] - 0xA0; // 區號
        if (0x10 <= zone && zone <= 0x57) // 16-87 區為漢字
        {
            bool found = false;
            for (int i = 0; i < _Allhz.Length; i++)
            {
                if (_Allhz[i][1].IndexOf(c) != -1)
                {
                    result.Append(_Allhz[i][0]);
                    found = true;
                    break;
                }
            }
            if (!found) result.Append(c); // 找不到保留原字
        }
        else
        {
            result.Append(c); // 非漢字區直接保留
        }
    }
    return result.ToString();
}

使用說明與限制

  • 優點:無需外部資料庫或字典檔,純程式碼部署極簡;支援大量常用漢字與多音字(取首個讀音)。
  • 限制:
    1. 依賴 GB2312 編碼,繁體中文環境需注意編碼轉換。
    2. 映射表為靜態硬編碼,維護擴充需修改原始碼重新編譯。
    3. 多音字僅回傳第一個拼音,無法依上下文斷詞選音。
    4. 非 BMP 字元(如生僻字、Emoji)會被忽略或原樣輸出。
  • 適用場景:檔案命名、排序索引、簡易搜尋關鍵字提取、內部工具原型開發。

進階替代方案建議

若需生產級、高準確度、支援繁簡體與多音字斷詞的拼音轉換,建議採用成熟開源庫:

  • Pinyin4net / Chinese.Pinyin (NuGet):基於 Unicode 標準,支援多音字權重、詞庫斷詞。
  • Microsoft Internationalized Domain Names Library:官方庫,含拼音轉換功能。
  • 自建詞庫 + 結巴分詞 (Jieba.NET) 斷詞後逐詞查表,精度最高。

完整原始碼下載

本文完整映射表(含 400+ 組拼音分區、超過 2 萬漢字對照)與兩個核心類別原始碼可從以下連結取得:
來源:51aspx 漢字轉拼音原始碼下載

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