取汉字/中文的拼音首字母
最近在项目中遇到个问题,要将人名前加拼音首字母,方便查找。
我在这方法中取得了一级和二级所有字库,也对常见的多音字姓氏做了修改。
传入参数是姓名,返回拼音首字母+姓名,例如:传入"张扬",返回"ZY张扬"
命名空间:
using System.Text.RegularExpressions;
方法如下:
/// <summary>
/// 获得名字首字母拼音
/// </summary>
/// <param name="ChineseStr"></param>
protected string GB2Spell(string ChineseStr)
{
try
{
//获得首字母
Regex CheckStr = new Regex("[\u4e00-\u9fa5]");
string Capstr = "";
byte[] ZW = new byte[2];
string CharStr, ChinaStr = "";
if (CheckStr.IsMatch(ChineseStr))//如果是汉字
{
for (int i = 0; i <= ChineseStr.Length - 1; i++)
{
//对常见的多音字姓氏特殊处理
string firstName = ChineseStr.Substring(0, 1).ToString();//单姓氏
if (i == 0 && firstName == "仇") { Capstr = "Q"; continue; }
if (i == 0 && firstName == "重") { Capstr = "C"; continue; }
if (i == 0 && firstName == "区") { Capstr = "O"; continue; }
if (i == 0 && firstName == "秘") { Capstr = "B"; continue; }
if (i == 0 && firstName == "解") { Capstr = "X"; continue; }
if (i == 0 && firstName == "折") { Capstr = "S"; continue; }
if (i == 0 && firstName == "单") { Capstr = "S"; continue; }
if (i == 0 && firstName == "翟") { Capstr = "Z"; continue; }
if (i == 0 && firstName == "查") { Capstr = "Z"; continue; }
if (i == 0 && firstName == "曾") { Capstr = "Z"; continue; }
string firstName2 = ChineseStr.Substring(0, 2).ToString();//多姓氏
if (i == 0 && firstName == "万俟") { Capstr = "MQ"; i++; continue; }
if (i == 0 && firstName == "尉迟") { Capstr = "YC"; i++; continue; }
CharStr = ChineseStr.Substring(i, 1).ToString();
ZW = System.Text.Encoding.Default.GetBytes(CharStr);
if (i == 0 && ZW.Length != 2)//如果第一个字符不是中文,则不需要加首字母拼音
break;
if (ZW.Length == 2)// 得到汉字符的字节数组
{
byte i1 = (byte)(ZW[0]);
byte i2 = (byte)(ZW[1]);
int int0 = i1 - 176;
int int1 = i2 - 161;
int intASCII = int0 * 94 + int1;
if (int0 < 0 || int0 > 71 || int1 < 0 || int1 > 93) ChinaStr = "";//不属于一级和二级字库
//处理一级字库
else if ((0 <= intASCII) && (intASCII < 36)) ChinaStr = "A";
else if (intASCII < 220) ChinaStr = "B";
else if (intASCII < 453) ChinaStr = "C";
else if (intASCII < 637) ChinaStr = "D";
else if (intASCII < 659) ChinaStr = "E";
else if (intASCII < 784) ChinaStr = "F";
else if (intASCII < 939) ChinaStr = "G";
else if (intASCII < 1120) ChinaStr = "H";
else if (intASCII < 1415) ChinaStr = "J";
else if (intASCII < 1515) ChinaStr = "K";
else if (intASCII < 1763) ChinaStr = "L";
else if (intASCII < 1914) ChinaStr = "M";
else if (intASCII < 1995) ChinaStr = "N";
else if (intASCII < 2003) ChinaStr = "O";
else if (intASCII < 2125) ChinaStr = "P";
else if (intASCII < 2282) ChinaStr = "Q";
else if (intASCII < 2341) ChinaStr = "R";
else if (intASCII < 2627) ChinaStr = "S";
else if (intASCII < 2783) ChinaStr = "T";
else if (intASCII < 2903) ChinaStr = "W";
else if (intASCII < 3126) ChinaStr = "X";
else if (intASCII < 3432) ChinaStr = "Y";
else if (intASCII == 3496) ChinaStr = "N";
else if (intASCII < 3757) ChinaStr = "Z";
//处理二级字库
else
{
string[] arrChars = new string[32];
/// 获得名字首字母拼音
/// </summary>
/// <param name="ChineseStr"></param>
protected string GB2Spell(string ChineseStr)
{
try
{
//获得首字母
Regex CheckStr = new Regex("[\u4e00-\u9fa5]");
string Capstr = "";
byte[] ZW = new byte[2];
string CharStr, ChinaStr = "";
if (CheckStr.IsMatch(ChineseStr))//如果是汉字
{
for (int i = 0; i <= ChineseStr.Length - 1; i++)
{
//对常见的多音字姓氏特殊处理
string firstName = ChineseStr.Substring(0, 1).ToString();//单姓氏
if (i == 0 && firstName == "仇") { Capstr = "Q"; continue; }
if (i == 0 && firstName == "重") { Capstr = "C"; continue; }
if (i == 0 && firstName == "区") { Capstr = "O"; continue; }
if (i == 0 && firstName == "秘") { Capstr = "B"; continue; }
if (i == 0 && firstName == "解") { Capstr = "X"; continue; }
if (i == 0 && firstName == "折") { Capstr = "S"; continue; }
if (i == 0 && firstName == "单") { Capstr = "S"; continue; }
if (i == 0 && firstName == "翟") { Capstr = "Z"; continue; }
if (i == 0 && firstName == "查") { Capstr = "Z"; continue; }
if (i == 0 && firstName == "曾") { Capstr = "Z"; continue; }
string firstName2 = ChineseStr.Substring(0, 2).ToString();//多姓氏
if (i == 0 && firstName == "万俟") { Capstr = "MQ"; i++; continue; }
if (i == 0 && firstName == "尉迟") { Capstr = "YC"; i++; continue; }
CharStr = ChineseStr.Substring(i, 1).ToString();
ZW = System.Text.Encoding.Default.GetBytes(CharStr);
if (i == 0 && ZW.Length != 2)//如果第一个字符不是中文,则不需要加首字母拼音
break;
if (ZW.Length == 2)// 得到汉字符的字节数组
{
byte i1 = (byte)(ZW[0]);
byte i2 = (byte)(ZW[1]);
int int0 = i1 - 176;
int int1 = i2 - 161;
int intASCII = int0 * 94 + int1;
if (int0 < 0 || int0 > 71 || int1 < 0 || int1 > 93) ChinaStr = "";//不属于一级和二级字库
//处理一级字库
else if ((0 <= intASCII) && (intASCII < 36)) ChinaStr = "A";
else if (intASCII < 220) ChinaStr = "B";
else if (intASCII < 453) ChinaStr = "C";
else if (intASCII < 637) ChinaStr = "D";
else if (intASCII < 659) ChinaStr = "E";
else if (intASCII < 784) ChinaStr = "F";
else if (intASCII < 939) ChinaStr = "G";
else if (intASCII < 1120) ChinaStr = "H";
else if (intASCII < 1415) ChinaStr = "J";
else if (intASCII < 1515) ChinaStr = "K";
else if (intASCII < 1763) ChinaStr = "L";
else if (intASCII < 1914) ChinaStr = "M";
else if (intASCII < 1995) ChinaStr = "N";
else if (intASCII < 2003) ChinaStr = "O";
else if (intASCII < 2125) ChinaStr = "P";
else if (intASCII < 2282) ChinaStr = "Q";
else if (intASCII < 2341) ChinaStr = "R";
else if (intASCII < 2627) ChinaStr = "S";
else if (intASCII < 2783) ChinaStr = "T";
else if (intASCII < 2903) ChinaStr = "W";
else if (intASCII < 3126) ChinaStr = "X";
else if (intASCII < 3432) ChinaStr = "Y";
else if (intASCII == 3496) ChinaStr = "N";
else if (intASCII < 3757) ChinaStr = "Z";
//处理二级字库
else
{
string[] arrChars = new string[32];
arrChars[0] = "CJWGNSPGCGNEYBTYYZDXYKYGTJNNJQMBSGZSCYJSYYPGKBZGYYWYKGKLJSWKPJQHYWDZLSGMRYPYWWCCKZNKYYG";
arrChars[1] = "TTNJJEYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJZXDTTSQZYCDXXHGCKPHFFSSYBGMXLPBYLLHLX";
arrChars[2] = "SZMJHSOJNGHDZQYKLGJHXGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZCJWQJBDZBXGZNZCPWHKXHQKMWFBPBY";
arrChars[3] = "DTJZZKQHYLYGXFPTYJYYZPSZLFCHMQSHGMXXSXJDCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBN";
arrChars[4] = "PTSDKDYLHGYMYLCXPYJNDQJWXQXFYYFJLEJPZRXCCQWQQSBZKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLX ";
arrChars[5] = "XGJMSHZKBSWYEMYLTXFSYDSGLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCL";
arrChars[6] = "QKXLHXJRZJMFQHXHWYWSBHTRXXGLHQHFNMYKLDYXZPWLGGMTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZH";
arrChars[7] = "ZXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDQMMZNGMMCLGWZSZXZJFZNMLZZTHCS";
arrChars[8] = "YDBDLLSCDDNLKJYKJSYCJLKOHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHNNNLHLYYQYHWZPTCZG";
arrChars[9] = "WWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYDCPCXYHLXCHYZJQQAGMNYXPFRKSSBJLYXY";
arrChars[10] = "SYGLNSCMHSWWMNZJJLXXHCHSYCTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLYDCCWZOCWKCCSBNHCPDYZNFCYYTYCKX";
arrChars[11] = "KYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHYQQHTQHPQQSCFYMMDMGBWHWLGSLLYSDLMLXPTHMJ";
arrChars[12] = "HWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZPMGFCSGLSXYMQSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCL";
arrChars[13] = "SLTCLRPBHZHXYYFHBGDMYCNQQWLQHJJYWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSLHTZKZJECXJCJNMFBYSFYWYB";
arrChars[14] = "JZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPABCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJXYZHWK";
arrChars[15] = "YPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQSHZYJZYDJWBMJKLDDPMJEGXYHYLXHLQYQHKYCW";
arrChars[16] = "CJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZ";
arrChars[17] = "LCLGJDJCSNCLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKJZYZHLYSZQLZNW";
arrChars[18] = "CZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSB";
arrChars[19] = "GBMMCJSSCLPQPDXCDYYKYCJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSS";
arrChars[20] = "LLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJCTXXLHJHFSXZQHFZMZCZTQCXZXRTT";
arrChars[21] = "DJHNNYZQQMNQDMMGYTXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSYN";
arrChars[22] = "SPRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJGYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZTDHQH";
arrChars[23] = "SDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKR";
arrChars[24] = "ZJSNFRGJHXPDHYJYBZGDLJCSEZGXLBLHYXTWMABCHECMWYJYZLLJJYHLGDJLSLYGKDZPZXJYYZLWCXSZFGWYYDLYHCLJS";
arrChars[25] = "CMBJHBLYZLYCBLYDPDQYSXQZBYTDKYYJYCNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCGLZCSHLTOLJNMDDDLNGKAQHQH";
arrChars[26] = "JHYKHEZNMSHRPQQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMM";
arrChars[27] = "MYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQFSZYJDJJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZKHHGFLBCSMDLDG";
arrChars[28] = "DZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYZQQYDFQJJLZZNZJCDGZYG";
arrChars[29] = "CTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZ";
arrChars[30] = "GSZZQLYLWTJPFSYAXMCJBTZYYCWMYTCSJJLQCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNDSZFDEQFHBS";
arrChars[31] = "AQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ";
arrChars[1] = "TTNJJEYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJZXDTTSQZYCDXXHGCKPHFFSSYBGMXLPBYLLHLX";
arrChars[2] = "SZMJHSOJNGHDZQYKLGJHXGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZCJWQJBDZBXGZNZCPWHKXHQKMWFBPBY";
arrChars[3] = "DTJZZKQHYLYGXFPTYJYYZPSZLFCHMQSHGMXXSXJDCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBN";
arrChars[4] = "PTSDKDYLHGYMYLCXPYJNDQJWXQXFYYFJLEJPZRXCCQWQQSBZKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLX ";
arrChars[5] = "XGJMSHZKBSWYEMYLTXFSYDSGLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCL";
arrChars[6] = "QKXLHXJRZJMFQHXHWYWSBHTRXXGLHQHFNMYKLDYXZPWLGGMTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZH";
arrChars[7] = "ZXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDQMMZNGMMCLGWZSZXZJFZNMLZZTHCS";
arrChars[8] = "YDBDLLSCDDNLKJYKJSYCJLKOHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHNNNLHLYYQYHWZPTCZG";
arrChars[9] = "WWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYDCPCXYHLXCHYZJQQAGMNYXPFRKSSBJLYXY";
arrChars[10] = "SYGLNSCMHSWWMNZJJLXXHCHSYCTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLYDCCWZOCWKCCSBNHCPDYZNFCYYTYCKX";
arrChars[11] = "KYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHYQQHTQHPQQSCFYMMDMGBWHWLGSLLYSDLMLXPTHMJ";
arrChars[12] = "HWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZPMGFCSGLSXYMQSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCL";
arrChars[13] = "SLTCLRPBHZHXYYFHBGDMYCNQQWLQHJJYWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSLHTZKZJECXJCJNMFBYSFYWYB";
arrChars[14] = "JZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPABCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJXYZHWK";
arrChars[15] = "YPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQSHZYJZYDJWBMJKLDDPMJEGXYHYLXHLQYQHKYCW";
arrChars[16] = "CJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZ";
arrChars[17] = "LCLGJDJCSNCLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKJZYZHLYSZQLZNW";
arrChars[18] = "CZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSB";
arrChars[19] = "GBMMCJSSCLPQPDXCDYYKYCJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSS";
arrChars[20] = "LLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJCTXXLHJHFSXZQHFZMZCZTQCXZXRTT";
arrChars[21] = "DJHNNYZQQMNQDMMGYTXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSYN";
arrChars[22] = "SPRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJGYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZTDHQH";
arrChars[23] = "SDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKR";
arrChars[24] = "ZJSNFRGJHXPDHYJYBZGDLJCSEZGXLBLHYXTWMABCHECMWYJYZLLJJYHLGDJLSLYGKDZPZXJYYZLWCXSZFGWYYDLYHCLJS";
arrChars[25] = "CMBJHBLYZLYCBLYDPDQYSXQZBYTDKYYJYCNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCGLZCSHLTOLJNMDDDLNGKAQHQH";
arrChars[26] = "JHYKHEZNMSHRPQQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMM";
arrChars[27] = "MYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQFSZYJDJJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZKHHGFLBCSMDLDG";
arrChars[28] = "DZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYZQQYDFQJJLZZNZJCDGZYG";
arrChars[29] = "CTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZ";
arrChars[30] = "GSZZQLYLWTJPFSYAXMCJBTZYYCWMYTCSJJLQCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNDSZFDEQFHBS";
arrChars[31] = "AQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ";
ChinaStr = arrChars[int0 - 40][int1].ToString().Trim();
}
Capstr += ChinaStr;
}
}
return Capstr + ChineseStr;
}
else return ChineseStr;//不是汉字就返回原来字符
}
catch
{
return ChineseStr;
}
}
}
Capstr += ChinaStr;
}
}
return Capstr + ChineseStr;
}
else return ChineseStr;//不是汉字就返回原来字符
}
catch
{
return ChineseStr;
}
}
ps:对于二级字库中的汉字,有些字符也是取得不正确,例如:茜玥芮溍珏芸褚赟瓛钰.百度了很长时间也没找到正确的二级字库.所以在程序中遇到不常用的字符也只能写死处理。

浙公网安备 33010602011771号