在delphi 7中实现获取汉字拼音首字母

     公司的餐饮系统出品的助记码,还没实现自动从出品名称获取汉字拼音首字母。

   所以在网上找了三种解决方法,

    一种是kaguo 的使用常用汉字拼音查找方法,这种代码十分简单,实现方便,但是这种代码仅仅是一级字库,只支持三千零几个字的。

//获取中文字串的声母的字串 function GetPY( hzchar:string):char; //guozhi------------ var tmpi:integer; begin tmpi := WORD(hzchar[1]) shl 8 + WORD(hzchar[2]); case tmpi 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;

         据kaguo说“了解一下汉字转化拼音的程序,你就知道多音字分析多难处理了。   比如"很多人参加",参应该是什么?很容易分析成“人参”。   这方面切实接触过,你就知道这种简单易行的分析是最合适的。” 

        参考地址是http://topic.csdn.net/t/20040812/14/3267676.html

   另一种是拼音库,不过有些下载没有声明到底支持多少个汉字,我统计过的一个拼音库最多支持7242个汉字,当然这个是提供源码的。这里最好的是据说“支持GBK大字符集,共可查20876个(1.0版为20588个)不同汉字的拼音或拼音首字母”的PARKE(R)柏克拼音DLL库(没有提供源码)。

         参考地址是http://download.csdn.net/source/136187

柏克拼音DLL只有两个函数,函数原型如下:

    //获得拼音
    //参数依次为: 拼音缓存区,要转换的字符,分隔符
    BOOL WINAPI GetPinYin(PCHAR pBuf,PCHAR pStr,PCHAR pSeparator)

    //获得拼音首字母
    //参数依次为: 拼音缓存区,要转换的字符
    BOOL WINAPI GetPinYinLeader(PCHAR pBuf,PCHAR pStr)

      在delphi 7下调用PARKE(R)柏克拼音DLL库,调用代码如下

        function GetPinYinLeader(pBuf : PChar;pStr : PChar): Boolean; stdcall; external 'Pinyin.dll';//声明库中的方法 procedure TForm1.btn3Click(Sender: TObject); var str1 : string; Pstr2 : Pchar; begin str1 := Trim(edt1.Text); //一定要分配内存,要不就出现访问地址错误 Pstr2 := StrAlloc(256); //给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.(这句来自万一的博客) GetPinYinLeader(Pstr2,PChar(str1)); edt2.Text := string(Pstr2); StrDispose(Pstr2); end;

     经过测试这四个字“吴2黨饐”得到的字符串是"w2dy"。结果应该是不错的。

     ps:以前在delphi没调用过C写的dll库,今天就学习一回。

   在C++builder6中动态调用的方法,(静态的调用试验没成功,主要是用implib没法生成正确的Pinyin.lib,内容缺文件名,一启动就报找不到文件,不知道谁可以帮忙解决这个问题)

  void __fastcall TForm1::btn1Click(TObject *Sender) { HINSTANCE PinYinAPI; bool _stdcall (*GetPinYinLeader)(char * ,char *); PinYinAPI = LoadLibrary("Pinyin.dll"); (FARPROC)GetPinYinLeader=GetProcAddress(PinYinAPI,"GetPinYinLeader");//FARPROC不知道是做什么用的,大概是转换什么指针类型的,在c++builder帮助中没有这样的解释。不加这个,编译不过去的 char cbuf[256]={0}; memset(cbuf,0,sizeof(cbuf)); char * cinput; cinput = (Trim(edt1->Text)).c_str(); GetPinYinLeader(cbuf,cinput); edt2->Text = cbuf; FreeLibrary(PinYinAPI); }

最后一种是从微软拼音输入法取出拼音库.必须安装“微软拼音输入法”,反查只能查询一个字的。查不了一个词组的。(当然经过适当的代码可以查出词组)

    参考地址:http://topic.csdn.net/t/20041118/09/3563659.html

你可能感兴趣的:(delphi,c,string,dll,输入法)