将中文转换成拼音在很多情况都会有这种需要。如果现去把中文转换成对应的拼音字符,大数据量的话速度会有很大的影响。前段时间看到有现成的中文的字典数据库,就想到了先把里面的部分内容摘出来了,用作中英文对换。当然网上有另外的一种格式如下:
a吖 阿 啊 锕------
b八 巴 叭 扒------
这种格式值能支持首字母的查询。现在采用的是这个格式(第一列对应汉子,第二列全拼,第三列首字母) :
乏 fa f
乌 wu w
丹 dan d
具体实现代码如下:
#ifndef QPINYIN_H
#define QPINYIN_H
#include <QObject>
#include <QMap>
#include <QVariant>
#include <QFile>
#include <QTextStream>
#include <QStringList>
//#include <QSqlDatabase>
//#include <QSqlQuery>
//
//暂时不用数据库,改用文本。速度还可以哈
//优点:不必要添加sql;程序发布是不用拷贝hanzi.db文件;支持全拼和首字母。
//缺点:导致程序发布是偏大;hanzi.txt需要添加到资源文件里;程序需要修改cpp的54行处。
/
class QPinYin : public QObject
{
Q_OBJECT
public:
QPinYin(QObject *parent = NULL)
{
//getMapFromDB();
getMapFromFile();
}
~QPinYin(){}
//获取中文的拼音
void getPinYin(const QString str, QString &allpy,QString fpy)
{
for (int i = 0; i < str.length(); ++i)
{
QString tstr = str.at(i);
QString p1 = m_allpymap.value(tstr);
QString p2 = m_pymap.value(tstr);
if(!p1.isEmpty())
allpy += p1;
else
allpy += tstr;
if (!p2.isEmpty())
fpy += p2;
else
fpy += tstr;
}
}
//
static QPinYin* instance()
{
static QPinYin *pinyin = new QPinYin();
return pinyin;
}
private:
//暂时不用,改用文本。
void getMapFromDB()
{
//m_db = QSqlDatabase::addDatabase("QSQLITE");
//m_db.setDatabaseName("hanzi.db");
//bool ok = m_db.open();
//if (!ok)
//{
// QMessageBox::critical(NULL,"Error","open db error");
// return;
//}
//m_query = QSqlQuery(m_db);
//m_allpymap.clear();
//m_pymap.clear();
//QString sql = QString("select zi,pinyin,py from xhzd_surnfu ") ;
//m_query.exec(sql);
//while (m_query.next())
//{
// QString zi = m_query.value(0).toString();
// QStringList tlist1 = m_query.value(1).toString().split(",");
// QStringList tlist2 = m_query.value(2).toString().split(",");
// m_allpymap.insert(zi,tlist1.at(0));
// m_pymap.insert(zi,tlist2.at(0));
//}
}
void getMapFromFile()
{
QFile file(":/pytest/hanzi.txt"); //应用的地方需要修改
if (!file.open(QFile::ReadOnly))
return;
m_allpymap.clear();
m_pymap.clear();
QTextStream outstream(&file);
outstream.setCodec("utf-8");
QStringList tlist;
while (!outstream.atEnd())
{
QString lines = outstream.readLine();
QStringList tmplist = lines.split(" ");
if (tmplist.count()!=3) continue;
QString zi = tmplist.at(0);
QStringList tlist1 = tmplist.at(1).split(",");
QStringList tlist2 = tmplist.at(2).split(",");
m_allpymap.insert(zi,tlist1.at(0));
m_pymap.insert(zi,tlist2.at(0));
}
}
private:
//QSqlDatabase m_db;
//QSqlQuery m_query;
QMap<QString,QString> m_allpymap;
QMap<QString,QString> m_pymap;
};
#ifndef PINYIN
#define PINYIN QPinYin::instance()
#endif
#endif // QPINYIN_H
使用方式(引用头文件):
QString pyinstr, ypins;
PINYIN->getPinYin("测试这个是不是好事",pyinstr,ypins);
注意:读取文件的地方需要修改成自己对应的目录文件。
需要的文件: https://pan.baidu.com/s/1cefMXhaWrQrqg6QF9vKTrw 密码: 7tqi