Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1720995
  • 博文数量: 171
  • 博客积分: 11553
  • 博客等级: 上将
  • 技术积分: 3986
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-25 20:28
文章分类

全部博文(171)

文章存档

2012年(2)

2011年(70)

2010年(9)

2009年(14)

2008年(76)

分类: C/C++

2008-03-15 16:41:04

汉字转化为拼音头文件(g2p.h)

#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

汉字转化拼音的实现文件(g2p.cpp)

#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;
        }
    }


文件:g2p.rar
大小:1KB
下载:下载
阅读(1818) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~