CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

请问一个音标方面的问题?

楼主hedong(电脑动能)2003-02-04 00:58:10 在 Delphi / VCL组件开发及应用 提问

如何根据中文的一个字或词组得到每一个汉字的首音标,  
  比如:   中国(ZG),     用户信息(YHXX)  
  问题点数:60、回复次数:8Top

1 楼grail_(grail_)回复于 2003-02-04 01:38:44 得分 4

建字库吧!  
  Top

2 楼EpopeeLei(午夜狂编)回复于 2003-02-04 01:52:29 得分 20

获取指定汉字的拼音索引字母,如:“汉”的索引字母是“H”}  
  function   GetPYIndexChar(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';  
          $D1B9..$D4D0:   result   :=   'Y';  
          $D4D1..$D7F9:   result   :=   'Z';  
      else  
          result   :=   char(0);  
      end;  
  end;Top

3 楼cg1120(代码最优化-§惟坚韧者始能遂其志§)回复于 2003-02-08 20:52:30 得分 30

unit   MainFrm;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      StdCtrls;  
   
  type  
      TMainForm   =   class(TForm)  
          ChineseEdt:   TEdit;  
          PYEdt:   TEdit;  
          btnConvert:   TButton;  
          Label1:   TLabel;  
          Label2:   TLabel;  
          Label3:   TLabel;  
          Label4:   TLabel;  
          Label5:   TLabel;  
          Label6:   TLabel;  
          procedure   btnConvertClick(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      MainForm:   TMainForm;  
   
  implementation  
   
  {$R   *.DFM}  
   
  //   获取指定汉字的拼音索引字母,如:“汉”的索引字母是“H”  
  function   GetPYIndexChar(   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';  
          $D1B9..$D4D0   :   result   :=   'Y';  
          $D4D1..$D7F9   :   result   :=   'Z';  
      else  
          result   :=   char(32);  
      end;  
  end;  
   
  procedure   TMainForm.btnConvertClick(Sender:   TObject);  
  var  
      I:   Integer;  
      PY:   string;  
      s:   string;  
  begin  
      s   :=   ''   ;  
      I   :=   1;  
      while   I   <=   Length(ChineseEdt.Text)   do  
      begin  
          PY   :=   Copy(ChineseEdt.Text,   I   ,   1);  
          if   PY   >=   Chr(128)   then  
          begin  
              Inc(I);  
              PY   :=   PY   +   Copy(ChineseEdt.Text,   I   ,   1);  
              s   :=   s   +   GetPYIndexChar(PY);  
          end  
          else  
              s   :=   s   +   PY;  
          Inc(I);  
      end;  
      PYEdt.Text   :=   s;  
  end;  
   
  end.  
  Top

4 楼cg1120(代码最优化-§惟坚韧者始能遂其志§)回复于 2003-02-08 20:52:46 得分 0

unit   HzSpell;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes;  
   
  type  
      THzSpell   =   class(TComponent)  
      protected  
          FHzText:   String;  
          FSpell:   String;  
          FSpellH:   String;  
          procedure   SetHzText(const   Value:   String);  
          function   GetHzSpell:   String;  
          function   GetPyHead:   String;  
      public  
          class   function   PyOfHz(Hz:   String):   String;  
          class   function   PyHeadOfHz(Hz:   String):   String;  
      published  
          property   HzText:   String   read   FHzText   write   SetHzText;  
          property   HzSpell:   String   read   GetHzSpell;  
          property   PyHead:   String   read   GetPyHead;  
      end;  
   
  {$I   HzSpDat2.inc}  
   
  procedure   Register;  
   
  function   GetHzPy(HzChar:   PChar;   Len:   Integer):   String;  
  function   GetHzPyFull(HzChar:   String):   String;  
  function   GetHzPyHead(HzChar:   PChar;   Len:   Integer):   String;  
  function   GetPyChars(HzChar:   String):   String;  
   
  implementation  
   
  procedure   Register;  
  begin  
      RegisterComponents('System',   [THzSpell]);  
  end;  
   
  function   GetHzPy(HzChar:   PChar;   Len:   Integer):   String;  
  var  
      C:   Char;  
      Index:   Integer;  
  begin  
      Result   :=   '';  
      if   (Len   >   1)   and   (HzChar[0]   >=   #129)   and   (HzChar[1]   >=   #64)   then  
      begin  
          //是否为   GBK   字符  
          case   HzChar[0]   of  
              #163:     //   全角   ASCII  
              begin  
                  C   :=   Chr(Ord(HzChar[1])   -   128);  
                  if   C   in   ['a'..'z',   'A'..'Z',   '0'..'9',   '(',   ')',   '[',   ']']   then  
                      Result   :=   C  
                  else  
                      Result   :=   '';  
              end;  
              #162:   //   罗马数字  
              begin  
                  if   HzChar[1]   >   #160   then  
                      Result   :=   CharIndex[Ord(HzChar[1])   -   160]  
                  else  
                      Result   :=   '';  
              end;  
              #166:   //   希腊字母  
              begin  
                  if   HzChar[1]   in   [#$A1..#$B8]   then  
                      Result   :=   CharIndex2[Ord(HzChar[1])   -   $A0]  
                  else   if   HzChar[1]   in   [#$C1..#$D8]   then  
                      Result   :=   CharIndex2[Ord(HzChar[1])   -   $C0]  
                  else  
                      Result   :=   '';  
              end;  
              else  
              begin     //   获得拼音索引  
                  Index   :=   PyCodeIndex[Ord(HzChar[0])   -   128,   Ord(HzChar[1])   -   63];  
                  if   Index   =   0   then  
                      Result   :=   ''  
                  else  
                      Result   :=   PyMusicCode[Index];  
              end;  
          end;  
      end  
      else   if   Len   >   0   then  
      begin  
          //在   GBK   字符集外,   即半角字符  
          if   HzChar[0]   in   ['a'..'z',   'A'..'Z',   '0'..'9',   '(',   ')',   '[',   ']']   then  
              Result   :=   HzChar[0]  
          else  
              Result   :=   '';  
      end;  
  end;  
   
  function   GetHzPyFull(HzChar:   String):   String;  
  var  
      i,   len:   Integer;  
      Py:   String;  
      function   IsDouByte(C:   Char):   Boolean;  
      begin  
          Result   :=   C   >=   #129;  
      end;  
  begin  
      Result   :=   '';  
      i   :=   1;  
      while   i   <=   Length(HzChar)   do  
      begin  
          if   IsDouByte(HzChar[i])   and   (Length(HzChar)   -   i   >   0)   then  
              len   :=   2  
          else  
              len   :=   1;  
          Py   :=   GetHzPy(@HzChar[i],   len);  
          Inc(i,   len);  
          if   (Result   <>   '')   and   (Py   <>   '')   then  
              Result   :=   Result   +   '   '   +   Py                       //   +   '   '  
          else  
              Result   :=   Result   +   Py;  
      end;  
  end;  
   
  function   GetHzPyHead(HzChar:   PChar;   Len:   Integer):   String;  
  begin  
      Result   :=   Copy(GetHzPy(HzChar,   Len),   1,   1);  
  end;  
   
  function   GetPyChars(HzChar:   String):   String;  
  var  
      i,   len:   Integer;  
      Py:   String;  
      function   IsDouByte(C:   Char):   Boolean;  
      begin  
          Result   :=   C   >=   #129;  
      end;  
  begin  
      Result   :=   '';  
      i   :=   1;  
      while   i   <=   Length(HzChar)   do  
      begin  
          if   IsDouByte(HzChar[i])   and   (Length(HzChar)   -   i   >   0)   then  
              len   :=   2  
          else  
              len   :=   1;  
          Py   :=   GetHzPyHead(@HzChar[i],   len);  
          Inc(i,   len);  
          Result   :=   Result   +   Py;  
      end;  
  end;  
   
  {   THzSpell   }  
   
  function   THzSpell.GetHzSpell:   String;  
  begin  
      if   FSpell   =   ''   then  
      begin  
          Result   :=   GetHzPyFull(FHzText);  
          FSpell   :=   Result;  
      end  
      else   Result   :=   FSpell;  
  end;  
   
  function   THzSpell.GetPyHead:   String;  
  begin  
      if   FSpellH   =   ''   then  
      begin  
          Result   :=   GetPyChars(FHzText);  
          FSpellH   :=   Result;  
      end  
      else   Result   :=   FSpellH;  
  end;  
   
  class   function   THzSpell.PyHeadOfHz(Hz:   String):   String;  
  begin  
      Result   :=   GetPyChars(Hz);  
  end;  
   
  class   function   THzSpell.PyOfHz(Hz:   String):   String;  
  begin  
      Result   :=   GetHzPyFull(Hz);  
  end;  
   
  procedure   THzSpell.SetHzText(const   Value:   String);  
  begin  
      FHzText   :=   Value;  
      FSpell   :=   '';  
      FSpellH   :=   '';  
  end;  
   
  end.Top

5 楼hedong(电脑动能)回复于 2003-02-09 12:56:40 得分 0

请解释一下:    
      case   WORD(hzchar[1])   shl   8   +   WORD(hzchar[2])   of      
  //hzchar是什么意思;  
  //WORD(hzchar[1])   shl   8   是什么意思?Top

6 楼___iGoogle___(出来混的是生是死要由自己来决定)回复于 2003-02-09 21:01:55 得分 2

好像不适用   UNICODETop

7 楼kaolaxiong(考拉熊)回复于 2003-02-14 13:23:38 得分 2

UPTop

8 楼hansion3406(阿木㊣拖鞋男)回复于 2003-02-15 17:35:37 得分 2

呼...Top

相关问题

  • 英语的音标
  • 音标如何输?
  • 音标字体的问题
  • 关于音标的显示
  • 如何显示英语音标字符?
  • 如何显示英文的音标?
  • 如何显示单词音标?
  • 如何显示单词音标?
  • 如何以音标顺序输出????????????????????????
  • ==="音标显示问题"(高手请进!)===

关键词

  • b2c
  • hzchar
  • result
  • py
  • read
  • property
  • inc
  • function

得分解答快速导航

  • 帖主:hedong
  • grail_
  • EpopeeLei
  • cg1120
  • ___iGoogle___
  • kaolaxiong
  • hansion3406

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo