程序点滴jcodeer.blog.chinaunix.net
jcodeer
全部博文(171)
2012年(2)
2011年(70)
2010年(9)
2009年(14)
2008年(76)
Bean_lee
GY123456
armlife
linky521
g_progra
猥琐才是
athzhang
CU博客助
meiyang_
heq76
gaokeke1
yangyefe
yanganni
tomcodin
qhy95020
allaxin
suntao32
13661379
分类: C/C++
2008-03-15 16:41:04
#ifndef __G2P_H__ #define __G2P_H__ /************************************************************************/ /* 程序说明 1.支持的汉字个数6763 GB2312; 2.汉字转化为拼音不考虑多音字问题; 3.汉字输出带有音调(1-4),没有考虑到轻声; 4.字典的格式为:每一行表示一转化的条目(汉字TAB拼音\r\n) */ /************************************************************************/ #include <fstream> #include <iomanip> #include <iostream> #include <map> #include <string> #define MAX_COLS_PY 50 #define E_OK 0x00L #define E_OPEN_FILE_FAILED 0x01L #define E_OUT_OF_MEMORY 0x02L #define E_BUFFER_ERROR 0x03L #define E_INVALID_ENGINE 0x04L #define E_ALREAD_DESTROYED 0x05L int SHCreateEngine(int nType,unsigned long* pnEngine); int SHReadDict(unsigned long nEngine,char* szDict); int SHGetPY(unsigned long nEngine,char* szGrapheme,char* szPhoneme,int* pnLen); int SHDestroyEngine(unsigned long* pnEngine); #endif
#include "stdafx.h" #include "g2p.h" typedef struct CG2PEngine { std::map<int,std::string> misG2PTable; }CG2PEngine; /************************************************************************/ /* 功能: 创建汉字转化拼音引擎,每调用一次此函数,也必须与之调用一次SHDestoryEngine 否则会产生内存泄漏。此函数在启动汉字拼音转化之前必须第一个调用,用以创建 转化引擎。 参数: nType in 指定转化引擎使用的字典编码方式,暂不实现此功能 pnEngine out 创建的引擎指针 返回值 E_OK 调用成功 E_OUT_OF_MEMORY 内存不足 */ /************************************************************************/ int SHCreateEngine(int nType,unsigned long* pnEngine) { *pnEngine = (unsigned long)new CG2PEngine; if(*pnEngine == 0) { return E_OUT_OF_MEMORY; } return E_OK; } /************************************************************************/ /* 功能: 读取汉字转化拼音的字典,可以多次调用此函数,达到更换字典的目的 参数: nEngine in 引擎指针 szDict in 字典所在的路径 返回值 E_OK 调用成功 E_OPEN_FILE_FAILED 内存不足 E_INVALID_ENGINE 转化引擎非法 */ /************************************************************************/ int SHReadDict(unsigned long nEngine,char* szDict) { CG2PEngine* pThis = (CG2PEngine*)nEngine; if(nEngine == 0) { return E_INVALID_ENGINE; } std::ifstream fin(szDict); if(fin == NULL) { return E_OPEN_FILE_FAILED; } char szLine[MAX_COLS_PY] = {0}; pThis->misG2PTable.clear(); while(fin.getline(szLine,MAX_COLS_PY)) { char* p = szLine; *(p+2) = 0; int nKey = int(*p) + int(((*(p+1)) << 8)); std::string strValue(p + 3); pThis->misG2PTable[nKey] = strValue; } return E_OK; } /************************************************************************/ /* 功能: 将汉字转化为拼音,使用GBK编码方式 参数: nEngine in 引擎指针 szGrapheme in 汉字缓冲区 szPhoeme out 拼音缓冲区 pnLen in 指定拼音缓冲区大小 out 拼音的实际大小 返回值 E_OK 调用成功 E_BUFFER_ERROR 给定拼音缓冲区的长度小于转化后拼音的长度 E_INVALID_ENGINE 转化引擎非法 */ /************************************************************************/ int SHGetPY(unsigned long nEngine,char* szGrapheme,char* szPhoneme,int* pnLen) { CG2PEngine* pThis = (CG2PEngine*)nEngine; if(nEngine == 0) { return E_INVALID_ENGINE; } char szPY[MAX_COLS_PY] = {0}; std::string strPy = pThis->misG2PTable[int(*szGrapheme) + int(((*(szGrapheme + 1)) << 8))]; if (strPy.length() <= *pnLen) { strcpy(szPhoneme,strPy.c_str()); *pnLen = strPy.length(); } else return E_BUFFER_ERROR; return E_OK; } /************************************************************************/ /* 功能: 释放汉字转化拼音引擎 参数 pnEngine in 汉字转化拼音引擎 out 汉字转化拼音引擎,将引擎指针置为NULL 返回值: S_OK 调用成功 E_ALREAD_DESTROYED 引擎已经释放 */ /************************************************************************/ int SHDestroyEngine(unsigned long* pnEngine) { if(*pnEngine != NULL) { delete (CG2PEngine*)(*pnEngine); *pnEngine = NULL; } else { return E_ALREAD_DESTROYED; } return E_OK; }
////测试汉字转化拼音 { unsigned long nEngine = 0; if(SHCreateEngine(0,&nEngine) != E_OK) { std::cout << "SHCreateEngine error" << std::endl; return -1; } if(SHReadDict(nEngine,"py.txt") != E_OK) { std::cout << "SHReadDict error" << std::endl; return -1; } char szPinYin[MAX_COLS_PY] = {0}; int nPinYin = MAX_COLS_PY; if(SHGetPY(nEngine,"我",szPinYin,&nPinYin) != E_OK) { std::cout << "SHGetPY error" << std::endl; return -1; }
std::cout << szPinYin << std::endl; if(SHDestroyEngine(&nEngine) != E_OK) { std::cout << "SHDestroyEngine error" <<std::endl; return -1; } }
上一篇:STL的IO操作之二
下一篇:ASP使用VB创建ActiveX组件
登录 注册