取汉字/中文的拼音首字母

最近在项目中遇到个问题,要将人名前加拼音首字母,方便查找。

 

我在这方法中取得了一级和二级所有字库,也对常见的多音字姓氏做了修改。

传入参数是姓名,返回拼音首字母+姓名,例如:传入"张扬",返回"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(01).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(02).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";
                                ChinaStr = arrChars[int0 - 40][int1].ToString().Trim();
                            }
                            Capstr += ChinaStr;
                        }
                    }
                    return Capstr + ChineseStr;
                }
                else return ChineseStr;//不是汉字就返回原来字符    
            }
            catch
            {
                return ChineseStr;
            }
        }
 
 
ps:对于二级字库中的汉字,有些字符也是取得不正确,例如:茜玥芮溍珏芸褚赟瓛钰.百度了很长时间也没找到正确的二级字库.所以在程序中遇到不常用的字符也只能写死处理。

 

 

posted @ 2012-09-07 16:49  南山0  阅读(303)  评论(0)    收藏  举报