查找了一下,网站里对于如何获取汉字拼音首字母的帖子不少,但都没提到多音字的问题。
如何获取汉字拼音首字母,这里就不讨论了,可以用通过字库,也可以通过判断汉字内码的方式。
需要请教各位的是,如果是多音字,该如何获取一段句子的首字母?
 比如“任长霞”,要返回二个结果:
   RCX
   RZX
 更复杂的“任长呆”,两个多音字,就要返回:
  RCD
  RZD
  RCA
  RZA这个如何通过算法实现?

解决方案 »

  1.   

    procedure TForm1.Edit1Change(Sender: TObject);
    var
        i:integer;
        hz:string;
    begin
        edit2.Text:='';
        for i:=1 to Length(edit1.Text) div 2 do
        begin
            hz:=Copy(edit1.Text,i*2-1,2);
            edit2.Text:=edit2.Text+getpy(hz);
        end;
    end;function TForm1.getPY(hzchar:string):char;
    begin
        case WORD(hzchar[1]) shl 8 + WORD(hzchar[2]) of
            $B0A1..$B0C4:result:='A';
            $B0C5..$B2C0:result:='B';
            $B2C1..$B4ED:result:='C';
            $B4EE..$B6E9:result:='D';
            $B6EA..$B7A1:result:='E';
            $B7A2..$B8C0:result:='F';
            $B8C1..$B9FD:result:='G';
            $B9FE..$BBF6:result:='H';
            $BBF7..$BFA5:result:='J';
            $BFA6..$C0AB:result:='K';
            $C0AC..$C2E7:result:='L';
            $C2E8..$C4C2:result:='M';
            $C4C3..$C5B5:result:='N';
            $C5B6..$C5BD:result:='O';
            $C5BE..$C6D9:result:='P';
            $C6DA..$C8BA:result:='Q';
            $C8BB..$C8F5:result:='R';
            $C8F6..$CBF9:result:='S';
            $CBFA..$CDD9:result:='T';
            $CDDA..$CEF3:result:='W';
            $CEF4..$D188:result:='X';
            $D189..$D4D0:result:='Y';
            $D4D1..$D7F9:result:='Z';
        else
            result:=char(32);
        end;
    end;
      

  2.   

    楼上的代码我想他自己都没试过。
    首先它只能处理GB2312种一区的三千多字,其次她不支持多音字。ms的字符影射表能非常好的显示出汉字的拼音,包括多音字,我不知道他怎么得到的。
    我能想到的办法就是查表法,通过拼音输入法转出来一个汉字和拼音的对照表,然后自己写程序查表。
      

  3.   

    fonganzen() 的方法我用过,不好,处理的字符太少,后来使用了字库遍历的方法,效果不错
    ,对于多音字,我想你在遍历时可以取出后面全部字符,如果多余一个,就做个循环,一个一个返回,让用户自己选
      

  4.   

    to  回复人: pazee(耙子)(今年过年不收礼,收礼只收尿不湿) ( ) 
    “楼上的代码我想他自己都没试过。”
    你没看清我写了测试通过吗,这就是从delphi里拷贝出来的。恐怕是你自己没试过吧,你都3颗星拉,该注意下形象,说话要负责任的。to  j54772091(风) ( ) 信誉:100 
    你说的有道理,我也发现了处理的字符太少这个问题了,还要求显示多音字看来只有遍历词库拉
      

  5.   

    楼上的,
    题目你都没看清,就急急忙忙的贴出来代码JF,我说的还错了吗?你这个代码在csdn上面提出来过无数次,也无数人说过这个代码的局限性,我不知道你怎么测试的,可能你理解的测试通过和我理解的不同。起码gb2312中接近一大半的汉字你得不到他的声母,因为二级字库是按照部首排序的。所以说这个代码在实际是没办法适用的。
      

  6.   

    现在做计算机应用的所写代码大部分都在csdn上面贴出来过无数次,这里本来就是一个快速找到答案的地方,我贴代码也是好心,最看不惯象你那样只会叽叽歪歪评论的,有这闲功夫你把你认为好的代码,算法贴出来啊。
      

  7.   

    http://www.tomore.com/3/13540.html这个我写的
      

  8.   

    多音字没搞过,试试pazee(耙子)的先
      

  9.   

    我试了一下也下不了了 :(当时因为一个项目需要,所以临时做了一个,现在回想起来很多地方都不完善,绕了弯路。1. 从xp中的全拼导出来文本的码表,之所以用全拼是因为他支持GBK。
    2. 写了个程序剔出了其中的词,重新排列了汉字和拼音
    3. 因为gbk的编码不是完全连续的,所以采用了折半查找(这就是我愚蠢的地方),
    4. 提供了汉字到拼音和拼音到汉字的函数针对问题三,我事后想了一下,完全可以利用查表的方式实现,其中的断码也没多少,如果采用查表,它的时间复杂度就从O(lg2n) 降到O(0)了。因为当时这个功能不是关键,之后也就没重写。