在网上看了很多关于C#获取中文汉字的首字母的资料,大部分都是只支持简体中文的。并且有的简体中文也是取不到。
我也尝试过安装微软的语言包来进行读取首字母,可是读出来的有些不正确,比如:石锅 —》“DG”。
请问谁有更好的方法实现啊?不胜感激。

解决方案 »

  1.   

    汉字文化博大精深
    有一种字叫  多音字
    比如  行:  是hang 不这是  xing ?
      

  2.   

     /// <summary>
            /// 获取字符串文中拼音简码
            /// </summary>
            /// <param name="IndexTxt">字符串</param>
            public static string GetSpellCode(string str)
            {
                if (StringToolKit.IsNullOrEmpty(str))
                {
                    return string.Empty;
                }
                string temp = null;
                for (int i = 0; i < str.Trim().Length; i++)
                {
                    temp = temp + GetSingleSpellCode(str.Substring(i, 1));
                }
                return temp;
            }
    // <summary>
            /// 获取字符串首个字符中文的简码
            /// </summary>
            public static String GetFirstSpellCode(string str)
            {
                return GetSingleSpellCode(str.Substring(0, 1));
            }        /// <summary>
            /// 获取单个字符的简码
            /// </summary>
            private static String GetSingleSpellCode(string oneStr)
            {
                char ch = Convert.ToChar(oneStr);
                int iCh = (int)ch;
                if (iCh >= 0 && iCh < 256)
                    return oneStr.ToUpper();
                else
                {
                    Encoding gbEncode = Encoding.GetEncoding("gb2312");
                    byte[] unicodeBytes = Encoding.Unicode.GetBytes(oneStr);
                    byte[] gbBytes = Encoding.Convert(Encoding.Unicode, gbEncode, unicodeBytes);
                    try
                    {
                        return GetX(Convert.ToInt32(string.Format("{0:D2}", Convert.ToInt16(gbBytes[0]) - 160) +
                                                    string.Format("{0:D2}", Convert.ToInt16(gbBytes[1]) - 160)));
                    }
                    catch
                    {
                        return string.Empty;
                    }
                }
            }        /// <summary>
            /// 根据区位得到汉字首字母
            /// </summary>
            /// <param name="GBCode">区位码</param>
            private static string GetX(int GBCode)
            {
                if (GBCode >= 1601 && GBCode < 1637) return "A";
                if (GBCode >= 1637 && GBCode < 1833) return "B";
                if (GBCode >= 1833 && GBCode < 2078) return "C";
                if (GBCode >= 2078 && GBCode < 2274) return "D";
                if (GBCode >= 2274 && GBCode < 2302) return "E";
                if (GBCode >= 2302 && GBCode < 2433) return "F";
                if (GBCode >= 2433 && GBCode < 2594) return "G";
                if (GBCode >= 2594 && GBCode < 2787) return "H";
                if (GBCode >= 2787 && GBCode < 3106) return "J";
                if (GBCode >= 3106 && GBCode < 3212) return "K";
                if (GBCode >= 3212 && GBCode < 3472) return "L";
                if (GBCode >= 3472 && GBCode < 3635) return "M";
                if (GBCode >= 3635 && GBCode < 3722) return "N";
                if (GBCode >= 3722 && GBCode < 3730) return "O";
                if (GBCode >= 3730 && GBCode < 3858) return "P";
                if (GBCode >= 3858 && GBCode < 4027) return "Q";
                if (GBCode >= 4027 && GBCode < 4086) return "R";
                if (GBCode >= 4086 && GBCode < 4390) return "S";
                if (GBCode >= 4390 && GBCode < 4558) return "T";
                if (GBCode >= 4558 && GBCode < 4684) return "W";
                if (GBCode >= 4684 && GBCode < 4925) return "X";
                if (GBCode >= 4925 && GBCode < 5249) return "Y";
                if (GBCode >= 5249 && GBCode <= 5589) return "Z";
                if (GBCode >= 5601 && GBCode <= 8794)
                {
                    string CodeData = "cjwgnspgcenegypbtwxzdxykygtpjnmjqmbsgzscyjsyyfpggbzgydywjkgaljswkbjqhyjwpdzlsgmr"
                      + "ybywwccgznkydgttngjeyekzydcjnmcylqlypyqbqrpzslwbdgkjfyxjwcltbncxjjjjcxdtqsqzycdxxhgckbphffss"
                      + "pybgmxjbbyglbhlssmzmpjhsojnghdzcdklgjhsgqzhxqgkezzwymcscjnyetxadzpmdssmzjjqjyzcjjfwqjbdzbjgd"
                      + "nzcbwhgxhqkmwfbpbqdtjjzkqhylcgxfptyjyyzpsjlfchmqshgmmxsxjpkdcmbbqbefsjwhwwgckpylqbgldlcctnma"
                      + "eddksjngkcsgxlhzaybdbtsdkdylhgymylcxpycjndqjwxqxfyyfjlejbzrwccqhqcsbzkymgplbmcrqcflnymyqmsqt"
                      + "rbcjthztqfrxchxmcjcjlxqgjmshzkbswxemdlckfsydsglycjjssjnqbjctyhbftdcyjdgwyghqfrxwckqkxebpdjpx"
                      + "jqsrmebwgjlbjslyysmdxlclqkxlhtjrjjmbjhxhwywcbhtrxxglhjhfbmgykldyxzpplggpmtcbbajjzyljtyanjgbj"
                      + "flqgdzyqcaxbkclecjsznslyzhlxlzcghbxzhznytdsbcjkdlzayffydlabbgqszkggldndnyskjshdlxxbcghxyggdj"
                      + "mmzngmmccgwzszxsjbznmlzdthcqydbdllscddnlkjyhjsycjlkohqasdhnhcsgaehdaashtcplcpqybsdmpjlpcjaql"
                      + "cdhjjasprchngjnlhlyyqyhwzpnccgwwmzffjqqqqxxaclbhkdjxdgmmydjxzllsygxgkjrywzwyclzmcsjzldbndcfc"
                      + "xyhlschycjqppqagmnyxpfrkssbjlyxyjjglnscmhcwwmnzjjlhmhchsyppttxrycsxbyhcsmxjsxnbwgpxxtaybgajc"
                      + "xlypdccwqocwkccsbnhcpdyznbcyytyckskybsqkkytqqxfcwchcwkelcqbsqyjqcclmthsywhmktlkjlychwheqjhtj"
                      + "hppqpqscfymmcmgbmhglgsllysdllljpchmjhwljcyhzjxhdxjlhxrswlwzjcbxmhzqxsdzpmgfcsglsdymjshxpjxom"
                      + "yqknmyblrthbcftpmgyxlchlhlzylxgsssscclsldclepbhshxyyfhbmgdfycnjqwlqhjjcywjztejjdhfblqxtqkwhd"
                      + "chqxagtlxljxmsljhdzkzjecxjcjnmbbjcsfywkbjzghysdcpqyrsljpclpwxsdwejbjcbcnaytmgmbapclyqbclzxcb"
                      + "nmsggfnzjjbzsfqyndxhpcqkzczwalsbccjxpozgwkybsgxfcfcdkhjbstlqfsgdslqwzkxtmhsbgzhjcrglyjbpmljs"
                      + "xlcjqqhzmjczydjwbmjklddpmjegxyhylxhlqyqhkycwcjmyhxnatjhyccxzpcqlbzwwwtwbqcmlbmynjcccxbbsnzzl"
                      + "jpljxyztzlgcldcklyrzzgqtgjhhgjljaxfgfjzslcfdqzlclgjdjcsnclljpjqdcclcjxmyzftsxgcgsbrzxjqqcczh"
                      + "gyjdjqqlzxjyldlbcyamcstylbdjbyregklzdzhldszchznwczcllwjqjjjkdgjcolbbzppglghtgzcygezmycnqcycy"
                      + "hbhgxkamtxyxnbskyzzgjzlqjdfcjxdygjqjjpmgwgjjjpkjsbgbmmcjssclpqpdxcdyykypcjddyygywchjrtgcnyql"
                      + "dkljczzgzccjgdyksgpzmdlcphnjafyzdjcnmwescsglbtzcgmsdllyxqsxsbljsbbsgghfjlwpmzjnlyywdqshzxtyy"
                      + "whmcyhywdbxbtlmswyyfsbjcbdxxlhjhfpsxzqhfzmqcztqcxzxrdkdjhnnyzqqfnqdmmgnydxmjgdhcdycbffallztd"
                      + "ltfkmxqzdngeqdbdczjdxbzgsqqddjcmbkxffxmkdmcsychzcmljdjynhprsjmkmpcklgdbqtfzswtfgglyplljzhgjj"
                      + "gypzltcsmcnbtjbhfkdhbyzgkpbbymtdlsxsbnpdkleycjnycdykzddhqgsdzsctarlltkzlgecllkjljjaqnbdggghf"
                      + "jtzqjsecshalqfmmgjnlyjbbtmlycxdcjpldlpcqdhsycbzsckbzmsljflhrbjsnbrgjhxpdgdjybzgdlgcsezgxlblg"
                      + "yxtwmabchecmwyjyzlljjshlgndjlslygkdzpzxjyyzlpcxszfgwyydlyhcljscmbjhblyjlycblydpdqysxktbytdkd"
                      + "xjypcnrjmfdjgklccjbctbjddbblblcdqrppxjcglzcshltoljnmdddlngkaqakgjgyhheznmshrphqqjchgmfprxcjg"
                      + "dychghlyrzqlcngjnzsqdkqjymszswlcfqjqxgbggxmdjwlmcrnfkkfsyyljbmqammmycctbshcptxxzzsmphfshmclm"
                      + "ldjfyqxsdyjdjjzzhqpdszglssjbckbxyqzjsgpsxjzqznqtbdkwxjkhhgflbcsmdldgdzdblzkycqnncsybzbfglzzx"
                      + "swmsccmqnjqsbdqsjtxxmbldxcclzshzcxrqjgjylxzfjphymzqqydfqjjlcznzjcdgzygcdxmzysctlkphtxhtlbjxj"
                      + "lxscdqccbbqjfqzfsltjbtkqbsxjjljchczdbzjdczjccprnlqcgpfczlclcxzdmxmphgsgzgszzqjxlwtjpfsyaslcj"
                      + "btckwcwmytcsjjljcqlwzmalbxyfbpnlschtgjwejjxxglljstgshjqlzfkcgnndszfdeqfhbsaqdgylbxmmygszldyd"
                      + "jmjjrgbjgkgdhgkblgkbdmbylxwcxyttybkmrjjzxqjbhlmhmjjzmqasldcyxyqdlqcafywyxqhz";
                    string gbcode = GBCode.ToString();
                    int pos = (Convert.ToInt16(gbcode.Substring(0, 2)) - 56) * 94 + Convert.ToInt16(gbcode.Substring(gbcode.Length - 2, 2));
                    return CodeData.Substring(pos - 1, 1);
                }
                return string.Empty;
            }
      

  3.   

    SQL中--建立函数:   
      create   function   f_ch2py(@chn   nchar(1))   
      returns   char(1)   
      as   
      begin   
      declare   @n   int   
      declare   @c   char(1)   
      set   @n   =   63   
        
      select   @n   =   @n   +1,   
                    @c   =   case   chn   when   @chn   then   char(@n)   else   @c   end   
      from(   
        select   top   27   *   from   (   
                select   chn   =     
      '吖'   union   all   select   
      '八'   union   all   select   
      '嚓'   union   all   select   
      '咑'   union   all   select   
      '妸'   union   all   select   
      '发'   union   all   select   
      '旮'   union   all   select   
      '铪'   union   all   select   
      '丌'   union   all   select     --because   have   no   'i'   
      '丌'   union   all   select   
      '咔'   union   all   select   
      '垃'   union   all   select   
      '嘸'   union   all   select   
      '拏'   union   all   select   
      '噢'   union   all   select   
      '妑'   union   all   select   
      '七'   union   all   select   
      '呥'   union   all   select   
      '仨'   union   all   select   
      '他'   union   all   select   
      '屲'   union   all   select     --no   'u'   
      '屲'   union   all   select     --no   'v'   
      '屲'   union   all   select   
      '夕'   union   all   select   
      '丫'   union   all   select   
      '帀'   union   all   select   @chn)   as   a   
      order   by   chn   COLLATE   Chinese_PRC_CI_AS     
      )   as   b   
      return(@c)   
      end   
      
      

  4.   

            public static string GetChineseSpell(string strText)
            {
                int len = strText.Length;
                string myStr = "";
                for (int i = 0; i < len; i++)
                {
                    myStr += getSpell(strText.Substring(i, 1));
                }
                return myStr;
            }        static private string getSpell(string cnChar)
            {
                byte[] arrCN = Encoding.Default.GetBytes(cnChar);
                if (arrCN.Length > 1)
                {
                    int area = (short)arrCN[0];
                    int pos = (short)arrCN[1];
                    int code = (area << 8) + pos;
                    int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };
                    for (int i = 0; i < 26; i++)
                    {
                        int max = 55290;
                        if (i != 25) max = areacode[i + 1];
                        if (areacode[i] <= code && code < max)
                        {
                            return Encoding.Default.GetString(new byte[] { (byte)(65 + i) });
                        }
                    }
                    return "*";
                }
                else return cnChar;
            }
      

  5.   

    SQL中--建立函数:   
      create function f_ch2py(@chn nchar(1))   
      returns char(1)   
      as   
      begin   
      declare @n int   
      declare @c char(1)   
      set @n = 63   
        
      select @n = @n +1,   
      @c = case chn when @chn then char(@n) else @c end   
      from(   
      select top 27 * from (   
      select chn =   
      '吖' union all select   
      '八' union all select   
      '嚓' union all select   
      '咑' union all select   
      '妸' union all select   
      '发' union all select   
      '旮' union all select   
      '铪' union all select   
      '丌' union all select --because have no 'i'   
      '丌' union all select   
      '咔' union all select   
      '垃' union all select   
      '嘸' union all select   
      '拏' union all select   
      '噢' union all select   
      '妑' union all select   
      '七' union all select   
      '呥' union all select   
      '仨' union all select   
      '他' union all select   
      '屲' union all select --no 'u'   
      '屲' union all select --no 'v'   
      '屲' union all select   
      '夕' union all select   
      '丫' union all select   
      '帀' union all select @chn) as a   
      order by chn COLLATE Chinese_PRC_CI_AS   
      ) as b   
      return(@c)   
      end