1.在数据库里处理
------------------------------------------------------------------------------------
/*  
            获取汉字拼音  
            调用:  
            select   dbo.f_GetPy('字符串')  
  */  
  create   function   f_GetPy(@str   nvarchar(4000))  
  returns   nvarchar(4000)  
  as  
  begin  
  declare   @strlen   int,@re   nvarchar(4000)  
  declare   @t   table(chr   nchar(1)   collate   Chinese_PRC_CI_AS,letter   nchar(1))  
  insert   into   @t(chr,letter)  
      select   '吖','A'   union   all   select   '八','B'   union   all  
      select   '嚓','C'   union   all   select   '咑','D'   union   all  
      select   '妸','E'   union   all   select   '发','F'   union   all  
      select   '旮','G'   union   all   select   '铪','H'   union   all  
      select   '丌','J'   union   all   select   '咔','K'   union   all  
      select   '垃','L'   union   all   select   '嘸','M'   union   all  
      select   '拏','N'   union   all   select   '噢','O'   union   all  
      select   '妑','P'   union   all   select   '七','Q'   union   all  
      select   '呥','R'   union   all   select   '仨','S'   union   all  
      select   '他','T'   union   all   select   '屲','W'   union   all  
      select   '夕','X'   union   all   select   '丫','Y'   union   all  
      select   '帀','Z'  
      select   @strlen=len(@str),@re=''  
      while   @strlen>0  
      begin  
          select   top   1   @re=letter+@re,@strlen=@strlen-1  
              from   @t   a   where   chr<=substring(@str,@strlen,1)  
              order   by   chr   desc  
          if   @@rowcount=0  
              select   @re=substring(@str,@strlen,1)+@re,@strlen=@strlen-1  
      end  
      return(@re)  
  end  
  go  

2.在程序中获得(C#_1)
---------------------------------------------------------------------------
获得汉字的拼音首字母       
  /**      
  description:   gb   2312-80   把收录的汉字分成两级。第一级汉字是常用汉字,计   3755   个,  
    *   置于   16~55   区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字,  
    *   计   3008   个,置于   56~87   区,按部首/笔画顺序排列,所以本程序只能查到  
    *   对一级汉字的声母。同时对符合声母只能取首字母        
    *    copyright:   copyright   (c)   2004       
    *    company:        
    *   @author   not   attributable  
    *   @version   1.0   
  */  
  public   class   getfirstletter   {     
  //   国标码和区位码转换常量  
      private   static   final   int   gb_sp_diff   =   160;  
   
  //存放国标一级汉字不同读音的起始区位码  
      private   static   final   int[]   secposvaluelist   =   {  
              1601,   1637,   1833,   2078,   2274,   2302,   2433,   2594,   2787,  
              3106,   3212,   3472,   3635,   3722,   3730,   3858,   4027,   4086,  
              4390,   4558,   4684,   4925,   5249,   5600};  
   
  //存放国标一级汉字不同读音的起始区位码对应读音  
      private   static   final   char[]   firstletter   =   {  
              a,   b,   c,   d,   e,   f,   g,   h,   j,  
              k,   l,   m,   n,   o,   p,   q,   r,   s,  
              t,   w,   x,   y,   z};  
   
  //获取一个字符串的拼音码  
      public   static   string   getfirstletter(string   oristr)   {  
          string   str   =   oristr.tolowercase();  
          stringbuffer   buffer   =   new   stringbuffer();  
          char   ch;  
          char[]   temp;  
          for   (int   i   =   0;   i   <   str.length();   i++)   {   //依次处理str中每个字符  
              ch   =   str.charat(i);  
              temp   =   new   char[]   {  
                      ch};  
              byte[]   unicode   =   new   string(temp).getbytes();  
              if   (unicode[0]   <   128   &&   unicode[0]   >   0)   {   //   非汉字  
                  buffer.append(temp);  
              }  
              else   {  
                  buffer.append(convert(unicode));  
              }  
          }  
          return   buffer.tostring();  
      }  
   
      /**   获取一个汉字的拼音首字母。  
        *   gb码两个字节分别减去160,转换成10进制码组合就可以得到区位码  
        *   例如汉字“你”的gb码是0xc4/0xe3,分别减去0xa0就是0x24/0x43  
        *   0x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为‘n’  
        */  
   
      private   static   char   convert(byte[]   bytes)   {  
   
          char   result   =   -;  
          int   secposvalue   =   0;  
          int   i;  
          for   (i   =   0;   i   <   bytes.length;   i++)   {  
              bytes[i]   -=   gb_sp_diff;  
          }  
          secposvalue   =   bytes[0]   *   100   +   bytes[1];  
          for   (i   =   0;   i   <   23;   i++)   {  
              if   (secposvalue   >=   secposvaluelist[i]   &&  
                      secposvalue   <   secposvaluelist[i   +   1])   {  
                  result   =   firstletter[i];  
                  break;  
              }  
          }  
          return   result;  
      }  
  }  


在程序中获得(C#_2)
---------------------------------------------------------------------------
//返回给定字符串的首字母
private String IndexCode(String IndexTxt)
{
    String _Temp=null;
    for(int i=0;i<IndexTxt.Length;i++)
    _Temp = _Temp + GetOneIndex( IndexTxt.Substring(i,1) );
    return _Temp;
}

//得到单个字符的首字母
private String GetOneIndex(String OneIndexTxt)
{
    if(Convert.ToChar(OneIndexTxt)>=0 && Convert.ToChar(OneIndexTxt)<256)
    return OneIndexTxt;
    else
    {
        Encoding gb2312 = Encoding.GetEncoding("gb2312");
        byte[] unicodeBytes = Encoding.Unicode.GetBytes(OneIndexTxt);
        byte[] gb2312Bytes = Encoding.Convert(Encoding.Unicode, gb2312, unicodeBytes);
        return GetX(Convert.ToInt32(String.Format("{0:D2}",Convert.ToInt16(gb2312Bytes[0])-160)
            + String.Format("{0:D2}",Convert.ToInt16(gb2312Bytes[1])-160)));
    }
}

//根据区位得到首字母
private 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 " ";
}
posted on 2007-12-25 10:33  liuhh  阅读(1168)  评论(0编辑  收藏  举报