如何取得汉字的完整拼音?

yuyulily 2002-10-15 09:38:52
如何取得汉字的完整拼音?不是汉字的首字母啊!Hawk_sun(骑士)兄在他的帖子中(http://www.csdn.net/expert/topic/1030/1030590.xml?temp=.8976099)说要用GetPhonetic()函数,可到底怎么用呢?请高手指点!
...全文
546 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuyulily 2002-11-15
  • 打赏
  • 举报
回复
caoenlong() :
我想用代码实现。

pzoon:
好,谢了,给你1分。
maxying 2002-11-15
  • 打赏
  • 举报
回复
关注中~~~
WhyAndAnswer 2002-11-14
  • 打赏
  • 举报
回复
学习
pzoon 2002-11-14
  • 打赏
  • 举报
回复
帮你的忙,同志么,,给点分吧
caoenlong 2002-11-14
  • 打赏
  • 举报
回复
控件不错的,很好用。
dafanshu 2002-11-07
  • 打赏
  • 举报
回复
学习
borland_boy 2002-11-05
  • 打赏
  • 举报
回复

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char aa;
aa=GB2PY(Edit1->Text.c_str());

/* Param:ch,the name string
return the first character of the name
if the first character of the name is not in A-Z,then return '['.
*/

}
//---------------------------------------------------------------------------
/* Param:ch,the name string
return the first character of the name
if the first character of the name is not in A-Z,then return '['.
*/
char GB2PY(char *ch)
{
char Result;
UCHAR GB_Code;
GB_Code=ch[0]*256+ch[1];

if(GB_Code>=0xb0a1&&GB_Code<=0xb0c4)
Result='a';
else if(GB_Code>=0xb0c5&&GB_Code<=0xb2c0)
Result='b';
else if(GB_Code>=0xb2c1&&GB_Code<=0xb4ed)
Result='c';
else if(GB_Code>=0xb4ee&&GB_Code<=0xb6e9)
Result='d';
else if(GB_Code>=0xb6ea&&GB_Code<=0xb7a1)
Result='e';
else if(GB_Code>=0xb7a2&&GB_Code<=0xb8c0)
Result='f';
else if(GB_Code>=0xb8c1&&GB_Code<=0xb9fd)
Result='g';
else if(GB_Code>=0xb9fe&&GB_Code<=0xbbf6)
Result='h';
else if(GB_Code>=0xbbf7&&GB_Code<=0xbfa5)
Result='j';
else if(GB_Code>=0xbfa6&&GB_Code<=0xc0ab)
Result='k';
else if(GB_Code>=0xc0ac&&GB_Code<=0xc2e7)
Result='l';
else if(GB_Code>=0xc2e8&&GB_Code<=0xc4c2)
Result='m';
else if(GB_Code>=0xc4c3&&GB_Code<=0xc5b5)
Result='n';
else if(GB_Code>=0xc5b6&&GB_Code<=0xc5bd)
Result='o';
else if(GB_Code>=0xc5be&&GB_Code<=0xc6d9)
Result='p';
else if(GB_Code>=0xc6da&&GB_Code<=0xc8ba)
Result='q';
else if(GB_Code>=0xc8bb&&GB_Code<=0xc8f5)
Result='r';
else if(GB_Code>=0xc8f6&&GB_Code<=0xcbf9)
Result='s';
else if(GB_Code>=0xcbfa&&GB_Code<=0xcdd9)
Result='t';
else if(GB_Code>=0xcdda&&GB_Code<=0xcef3)
Result='w';
else if(GB_Code>=0xcef4&&GB_Code<=0xd1b8)
Result='x';
else if(GB_Code>=0xd1b9&&GB_Code<=0xd4d0)
Result='y';
else if(GB_Code>=0xd4d1&&GB_Code<=0xd7f9)
Result='z';
else
Result=ch[0];
if(Result>=97&&Result<=122)
Result-=32;
if(!(Result>=65&&Result<=90))
Result='[';
return Result;
}
yuyulily 2002-11-04
  • 打赏
  • 举报
回复
up
kk_liwei 2002-10-28
  • 打赏
  • 举报
回复
mark and push!
drivers 2002-10-28
  • 打赏
  • 举报
回复
gz
mynameis007 2002-10-23
  • 打赏
  • 举报
回复
gz
yuyulily 2002-10-22
  • 打赏
  • 举报
回复
感谢Hawk_sun(骑士)的捧场,呵呵,终于看到希望了!
Hawk_sun 2002-10-22
  • 打赏
  • 举报
回复
大家好!
好久没有上来了!因为这段时间一直在忙关于汉语合成算法的评审。所以每天只是上来瞄了一眼。今天看到 yuyulily (打工仔) 的短消息,所以也过来捧捧场。多说几句。
关于怎样取得汉字的拼音,一共有三种办法,一一列举如下:

1。通过输入法的逆转换功能
目前肯定支持该方法的输入法有微软拼音输入法,同时微软也提供了一套API用以实现这种转换。
这种方法的优点是能解决多音字问题,缺点是用户必须安装微软拼音输入法。使用这种方法的基本步骤是:
1〉查询本机输入法列表,使用API函数GetKeyboardLayoutList。
2〉得到输入法的名称,使用API函数ImmEscape。
3〉看看这个输入法是否支持Reverse Conversion功能,使用API函数
ImmGetConversionList。
4〉如果该种输入法支持Reverse Conversion功能,继续使用ImmGetConversionList函数来获得指定汉字的拼音。

关于这几个API函数的使用和要注意的问题你们可以查询MSDN.

我下面要讲的第二种办法,也就是上面诸位提到的一种很直接的办法,就是利用查表的办法,但是查表也有讲究,因为这是与效率相关的,表格的组织形式直接影响查表的速度。我介绍一点我的经验。

1〉获得GB2312种所有汉字的一张读音表。这种表格网上到处都是,如果确实没有,就利用windows的码表逆转换功能,将拼音输入法的码表文件转换成字根文件,但是这里有个缺点,就是无法取得声调信息。但是网络上的各种标准化组织的网站上又很多提供这个文件下载的网站,我曾经到过一个Unicode的标准化推广网站,上面就有"GB码---Unicode---拼音"的对应关系表,可惜我忘记了网站的地址,相信很多人自己已经有了这样一张表。

2>构造一个散列函数,该函数记为y=f(x);
如果你是利用Unicode作为查表的索引,那么x就应该代表该汉字的Unicode,y就代表该汉字在文件中的偏移量,如果每个汉字在文件中的存放格式类似于A:B,其中A为该汉字,B为该汉字的拼音字符串,那么y+3这个偏移量就代表拼音的起始位置.假定每个条目用15个字节来存放,那么你只需要读出y+3到y+15的字符串就能取到汉字的拼音.
同样,如果你利用GB码或者Big5码或者UTF8编码,那么x就表示这个编码,y同样表示这个位置.
从上述算法看,为了避免查表时文件指针的频繁前后定位,同时也为了保证y的唯一性,对散列函数的构造有特殊的要求,即算出来的位置不能重复,不能覆盖,且要保证有15个字节的偏移余量.

3>构造好散列函数之后,利用现成的汉字--拼音对应表构造一个高效率的表文件,将汉字和其拼音一一读入,按照散列函数将汉字和拼音一一写入对应的位置.于是得到一个新的码表文件.

4>最后,在你的程序中可以随心所欲的利用这个文件来查拼音.

再来讲第三种方法:
利用IFELLanguage接口.在windowsNt以及以后的版本中,微软公司内置了一个IFELLanguage接口,这个接口实现了对系统本地编码表的访问.该接口包含很多方法.(稍候我会继续!!)






yuyulily 2002-10-21
  • 打赏
  • 举报
回复
up
yuyulily 2002-10-21
  • 打赏
  • 举报
回复
up
yuyulily 2002-10-18
  • 打赏
  • 举报
回复
只取拚音声母不行啊,我需要全拼
大大怪老张 2002-10-18
  • 打赏
  • 举报
回复
关注
abomb 2002-10-18
  • 打赏
  • 举报
回复
这个是我用的函数,不过是取拚音声母的
AnsiString ConvertHZToPY(char *as_HzString)
{
static int li_SecPosValue[]={1601,1637,1833,2078,2274,2302,2433,2594,2787,3106,3212,3472,3635,3722,3730,3858,4027,4086,4390,4558,4684,4925,5249};
static char* lc_FirstLetter[] = {"A", "B","C","D","E","F","G","H","J","K","L","M","N","O","P","Q","R","S","T","W","X","Y","Z"};
static char* ls_SecondSecTable =
"CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY"
"LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWY"
"WSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMY"
"DJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZP"
"MGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJB"
"PMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTX"
"YXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGS"
"QQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJ"
"YYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZK"
"HHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQ"
"FHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ";


AnsiString result = "";
int H,L,W;
unsigned int i, stringlen = strlen(as_HzString);
int j;

for( i = 0; i < stringlen; i ++ )
{
H = (unsigned char)(as_HzString[i + 0]);
L = (unsigned char)(as_HzString[i + 1]);
if(H < 0xA1 || L < 0xA1)
{
result += as_HzString[i];
continue;
}
else W = (H - 160) * 100 + L - 160;
if(W > 1600 && W < 5590)
{
for(j = 22; j >= 0; j --)
if(W >= li_SecPosValue[j])
{
result += lc_FirstLetter[j];
i ++;
break;
}
continue;
}
else
{
i ++;
W = ( H - 160 - 56 )*94 + L - 161;
if(W >= 0 && W <= 3007)
result += ls_SecondSecTable[W];
else
{
result += (char)H;
result += (char)L;
}
}
}
return result;
}
yuyulily 2002-10-18
  • 打赏
  • 举报
回复
谢谢Dermao(知了) ,但这个方法好象太费工了。
imageonline 2002-10-18
  • 打赏
  • 举报
回复
up
加载更多回复(22)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧