www.pudn.com > 智能内码识别,支持屏幕取词翻译的程序.zip > ETOC.CPP
//英汉翻译 #include "stdafx.h" #include#include "etoc.h" CEtoC OEtoC ; //英汉翻译对象 //读入库内容 CEtoC::CEtoC( void ) { hpsLib =NULL ; } //装入翻译字库 BOOL CEtoC::LoadDict( void ) { //打开文件 if( !Open( DICT_NAME , CFile::modeRead ) ) { ::MessageBox( 0 , "Open file error,in LoadDict!" , 0 , MB_OK ) ; return 0 ; } //得到库长度 DWORD dwLibLen=GetLength() ; //分配空间 hpsLib =(char huge*)GlobalAllocPtr( GMEM_FIXED , dwLibLen ) ; if( !hpsLib ) { ::MessageBox( 0 , "GlobalAllocPtr error" , 0 , MB_OK ) ; return 0 ; } //读出库内容 ReadHuge( hpsLib , dwLibLen ) ; //关闭文件 Close() ; lpLibHead =(LIB_HEAD far*)hpsLib ; //得到库头 //判断文件是否正确 if( dwLibLen != lpLibHead->dwLibLen ) //库有问题 { ::MessageBox( 0 , "The etoc.lib is error" , 0 , MB_OK ) ; return 0 ; } return 1 ; } void CEtoC::UnloadDict( void ) { if( hpsLib ) { GlobalFreePtr( hpsLib ) ; hpsLib =NULL ; } } //英汉翻译,返回0,出错,1完全匹配,2非完全匹配 int CEtoC::EnglishToChinese( LPCSTR lpcsEnglish , int nLenOfEnglish , LPSTR lpsChinese , int nLenOfChinese , LPINT lpnLenOfResult ) { char sBuff[300] ; if( (UINT)nLenOfEnglish <= 0 || (UINT)nLenOfEnglish > lpLibHead->uWordClassNum ) //长度不对 { strcpy( sBuff , "长度错误!" ) ; *lpnLenOfResult =min( nLenOfChinese , strlen( sBuff ) ) ; _fstrncpy( lpsChinese , sBuff , *lpnLenOfResult ) ; return 0 ; } //检查该类是否有词 if( lpLibHead->dwStartPos[nLenOfEnglish-1] == 0 || lpLibHead->dwWordNum[nLenOfEnglish-1] == 0 ) { strcpy( sBuff , "不好意思,我不会翻译这个词." ) ; *lpnLenOfResult =min( nLenOfChinese , strlen( sBuff ) ) ; _fstrncpy( lpsChinese , sBuff , *lpnLenOfResult ) ; return 0 ; } //检索该英文单词的含义 DWORD dwItemLen =nLenOfEnglish+5 ; //该词类的项长度 DWORD dwFirst =0 ; DWORD dwLast =lpLibHead->dwWordNum[nLenOfEnglish-1] - 1 ; DWORD dwMiddle=0 ; DWORD dwMiddlePoint=0 ; //中间词的指针 WORD_CLASS far *lpWord ; int n ; //以二分法进行检索 while( dwFirst <= dwLast ) { dwMiddle =( ( dwFirst+dwLast )/2 ) ; dwMiddlePoint =dwMiddle*dwItemLen ; n =_fstrnicmp( lpcsEnglish , hpsLib + lpLibHead->dwStartPos[nLenOfEnglish-1] + dwMiddlePoint , nLenOfEnglish ) ; if( !n ) //相等 { lpWord =(WORD_CLASS far*)( hpsLib + lpLibHead->dwStartPos[nLenOfEnglish-1] + dwMiddlePoint + nLenOfEnglish ) ; _fstrncpy( lpsChinese , lpcsEnglish , nLenOfEnglish ) ; lpsChinese[nLenOfEnglish] =':' ; if( nLenOfEnglish+1+nLenOfChinese < lpWord->bLen ) //缓冲区长度太小 { _fstrncpy( lpsChinese+nLenOfEnglish+1 , hpsLib + lpWord->dwStartPos , nLenOfChinese-nLenOfEnglish-1 ) ; *lpnLenOfResult =nLenOfEnglish+1+nLenOfChinese ; lpsChinese[*lpnLenOfResult] ='\0' ; return 0 ; } else { _fstrncpy( lpsChinese+nLenOfEnglish+1 , hpsLib + lpWord->dwStartPos , lpWord->bLen ) ; *lpnLenOfResult =nLenOfEnglish+1+lpWord->bLen ; lpsChinese[*lpnLenOfResult] ='\0' ; return 1 ; } } if( n<0 ) { if( !dwMiddle ) //已经为0了 break ; dwLast =dwMiddle-1 ; } else dwFirst =dwMiddle+1 ; } //没有匹配者,以中间值代替 //组织输出结果 char far *lp ; lp =(char far*)sBuff ; //给英文名字 _fstrncpy( lp , hpsLib + lpLibHead->dwStartPos[nLenOfEnglish-1] + dwMiddlePoint , nLenOfEnglish ) ; lp +=nLenOfEnglish ; *lp++ =':' ; //给中文含义 lpWord =(WORD_CLASS far*)( hpsLib + lpLibHead->dwStartPos[nLenOfEnglish-1] + dwMiddlePoint + nLenOfEnglish ) ; _fstrncpy( lp , hpsLib + lpWord->dwStartPos , lpWord->bLen ) ; lp +=lpWord->bLen ; *lp ='\0' ; *lpnLenOfResult =min( nLenOfChinese , strlen( sBuff ) ) ; _fstrncpy( lpsChinese , sBuff , *lpnLenOfResult ) ; lpsChinese[*lpnLenOfResult] ='\0' ; // WritePrivateProfileString( "test" , "s" , lpsChinese , "test.ini" ) ; return 2 ; } #ifdef __cplusplus extern "C" { #endif //装入翻译字库 BOOL __export FAR PASCAL LoadDict( void ) { return OEtoC.LoadDict() ; } //卸掉翻译字库 void __export FAR PASCAL UnloadDict( void ) { OEtoC.UnloadDict() ; } //对外输出的函数 #define HOU_ZHUI_NUM 6 //后缀数目 #define BUFF_LEN 100 BOOL __export FAR PASCAL EnglishToChinese( LPCSTR lpcsEnglish , int nLenOfEnglish , LPSTR lpsChinese , int nLenOfChinese , LPINT lpnLenOfResult ) { char sDelStr[HOU_ZHUI_NUM][10]= //减去某部分 { "s" , "es" , "ing" , "ing" , "ed" , "ied" } ; char sAddStr[HOU_ZHUI_NUM][10]= //减去后,再加上某个部分 { "" , "" , "" , "e" , "" , "y" } ; int n =OEtoC.EnglishToChinese( lpcsEnglish , nLenOfEnglish , lpsChinese , nLenOfChinese , lpnLenOfResult ) ; if( n==0 || n==1 ) return (BOOL)n ; char sBuff[BUFF_LEN] ; int nLen , nDelStr ; for( int i=0 ; i BUFF_LEN ) continue ; _fstrncpy( sBuff , lpcsEnglish , nLenOfEnglish-nDelStr ) ; strncpy( sBuff+nLenOfEnglish-nDelStr , sAddStr[i] , strlen(sAddStr[i]) ) ; n =OEtoC.EnglishToChinese( sBuff , nLen , lpsChinese , nLenOfChinese , lpnLenOfResult ) ; if( n==0 || n==1 ) return (BOOL)n ; } return OEtoC.EnglishToChinese( lpcsEnglish , nLenOfEnglish , lpsChinese , nLenOfChinese , lpnLenOfResult ) ; } #ifdef __cplusplus } #endif