Chinaunix首页 | 论坛 | 博客
  • 博客访问: 109053
  • 博文数量: 24
  • 博客积分: 1475
  • 博客等级: 上尉
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-04 14:14
个人简介

交互设计在未来很有前途,不要再说是做界面的了。

文章分类

全部博文(24)

文章存档

2013年(2)

2012年(2)

2010年(4)

2009年(2)

2007年(11)

2006年(3)

我的朋友

分类: C/C++

2007-01-20 13:45:56

 

一种将汉字转化为拼音的方法

网上常见的实现方式只能是实现常见字(也就是一级汉字)的搜索,因为一级汉字是按照拼音编码的,所以可以根据汉字的机内码对照来直接得到它的拼音,而对于非常见字(也就是二级汉字),其排序方式是按照偏旁部首来的,这个时候就不能采用上面的机内码的方式来得到拼音了。考虑到我们输入汉字的时候,输入法中可以显示非常见字,那么,我们是不是可以利用拼音输入法的字库来实现汉字到拼音的转换呢?答案是肯定的.

windows系统中,拼音输入法的字库文件为c:/winnt/system/winpy.mb,windows xp系统中有一个imegen.exe程序,该程序用来协助用户生成自己的输入法,同时它还提供了一个逆转换功能,可以将winpy.mb文件转换成普通的txt文件,该文件中包含了所有字和与之相对应的拼音,利用这个文件,我们就可以得到所有的输入法中能够输入的汉字的拼音了.

       Imegen.exe程序界面

                     

程序运行界面:

            

主要代码:

// 读取由windows拼音输入法生成的字库文件

       QFile file( "D:\\qt_study\\hz2py\\winpy.txt" );

    if ( file.open( IO_ReadOnly ) )

       {

        QTextStream stream( &file );

        QString line;

              i = 1;

          while ( !stream.atEnd())

              {

            line = stream.readLine();

                     lines+=line;    

                     i++;

                     QChar tt_pre = 0,tt_cur = 0;

 

                     /**

                       找到第一个拼音字符,考虑到字库的特殊性,linelength肯定大于1,

                       而且第一个字母至少在j==1的情况下才会出现,所以有下面的获取方式

                     */

                     for(j=1;j

                     {                  

                            if (line.at(j).latin1() != 0)

                            {

                                   tt_cur = line.at(j);  

                                   tt_pre = line.at(j-1);

                                   break;

                            }                                

                     }

                     QString str1 = line.section(tt_cur,0,0); /** 字库中的一条汉字 */

                     QString str2 = line.section(tt_pre,1); /** 对应上述汉字的拼音 */

                     zkList+=str1;

                     zkList2+=str2;

              }           

        file.close();

    }

将汉字字符串转化为拼音

    int polyphone_flag = 0;

       QString resStr = 0;

       for(i=0;i

       {

              j = 0;

              polyphone_flag = 0;

              for ( QStringList::Iterator it = zkList.begin(); it != zkList.end(); ++it,j++)

              {

                     if ((*it) == QString("%1").arg(hz.at(i)))

                     {

                            if (polyphone_flag == 1) /* 对于多音字,在第一个拼音后面以[*]标出*/

                            {

                                   resStr = resStr +" " + "[" + *zkList2.at(j) +"]";

                            }

                            else

                            {

                                   resStr = resStr + " " + *zkList2.at(j);

                            }

                            polyphone_flag = 1;

                     }

              }

              if (polyphone_flag == 0)   /* 没有找到这个字,可能是标点符号或者一般ascii字符 */

              {

                     resStr+=QString("%1").arg(hz.at(i));

              }

       }

 几点说明:

1.         程序在windows xp操作系统qt3.3.2,vc6环境下调试成功.   

2.         字库文件中多音字存在几个拼音,需要把后面的几个拼音去掉,当然,也可以不去掉而在程序中进行处理.

3.         为了提高效率,可以使用hash表而不是使用qstringlist数据结构.

4.         该方法可以用于任何qt支持平台下的汉字检索或者排序功能.

5.         转出的字库文件有些汉字多出的拼音很不长见,如台有三个音,tai,si,yi但输入法中只有一个音,不知道是何原因.

 

 

阅读(3657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~