交互设计在未来很有前途,不要再说是做界面的了。
分类: 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;
/**
找到第一个拼音字符,考虑到字库的特殊性,line的length肯定大于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操作系统qt
2. 字库文件中多音字存在几个拼音,需要把后面的几个拼音去掉,当然,也可以不去掉而在程序中进行处理.
3. 为了提高效率,可以使用hash表而不是使用qstringlist数据结构.
4. 该方法可以用于任何qt支持平台下的汉字检索或者排序功能.
5. 转出的字库文件有些汉字多出的拼音很不长见,如台有三个音,tai,si,yi但输入法中只有一个音,不知道是何原因.