簡單的 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>
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);
}
}
採用靜態字串陣列映射表,每筆資料首字為拼音大寫字母,後接該字母對應的所有漢字。查找時遍歷陣列,找到包含目標字元的字串,取其首字元即為首字母。
private static string[] strChineseCharList =
{
"A阿啊锕嗄厑哎哀唉埃挨溾锿鎄啀捱皚凒溰嘊敳皚癌毐昹嗳矮藹躷噯藹譪霭靄艾伌愛砹硋隘嗌塧嫒愛礙暧瑷僾壒嬡懓薆曖璦鴱皧瞹馤鑀鱫安侒峖桉氨庵谙萻腤鹌蓭誝鞌鞍盦馣鮟盫韽啽雸垵",
"A俺唵埯铵隌揞罯銨犴岸按荌案胺豻堓婩暗貋儑錌黯骯岇昂昻枊盎醠凹坳垇柪軪爊敖厫隞嗷嗸嶅廒滶獒獓遨熬璈蔜翱聱螯翶謷翺鳌鏖鰲鷔鼇芺襖媪镺襖岙扷岰傲奡奧嫯慠骜奧嶴澳懊擙謸鏊",
"B八仈巴叭扒朳玐吧夿岜芭疤哵捌笆粑紦羓蚆釟豝鲃魞叐犮抜坺妭拔茇炦癹胈釛菝詙跋軷魃把靶壩弝爸垻罷鲅鮁覇矲霸壩灞欛挀掰白百佰柏栢捭竡粨擺擺襬呗拝敗拜唄敗稗粺鞁薭贁兡瓸扳",
// ... 後續包含 B、C、D ... 至 Z 全部拼音分區,總計超過 400 組映射字串
};
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();
}
依據 GB2312 區位碼規則 實作:
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 完整對照表
};
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();
}
若需生產級、高準確度、支援繁簡體與多音字斷詞的拼音轉換,建議採用成熟開源庫:
本文完整映射表(含 400+ 組拼音分區、超過 2 萬漢字對照)與兩個核心類別原始碼可從以下連結取得:
來源:51aspx 漢字轉拼音原始碼下載