Qt中英文匹配

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chyuanrufeng/article/details/80903630

将中文转换成拼音在很多情况都会有这种需要。如果现去把中文转换成对应的拼音字符,大数据量的话速度会有很大的影响。前段时间看到有现成的中文的字典数据库,就想到了先把里面的部分内容摘出来了,用作中英文对换。当然网上有另外的一种格式如下:

    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


猜你喜欢

转载自blog.csdn.net/chyuanrufeng/article/details/80903630
今日推荐