ETOC.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:6k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. //英汉翻译
  2. #include "stdafx.h"
  3. #include <windowsx.h>
  4. #include "etoc.h"
  5. CEtoC OEtoC ; //英汉翻译对象
  6. //读入库内容
  7. CEtoC::CEtoC( void )
  8. {
  9. hpsLib =NULL ;
  10. }
  11. //装入翻译字库
  12. BOOL CEtoC::LoadDict( void )
  13. {
  14. //打开文件
  15. if( !Open( DICT_NAME , CFile::modeRead ) )
  16. {
  17. ::MessageBox( 0 , "Open file error,in LoadDict!" , 0 , MB_OK ) ;
  18. return 0 ;
  19. }
  20. //得到库长度
  21. DWORD dwLibLen=GetLength() ;
  22. //分配空间
  23. hpsLib =(char huge*)GlobalAllocPtr( GMEM_FIXED , 
  24. dwLibLen ) ;
  25. if( !hpsLib )
  26. {
  27. ::MessageBox( 0 , "GlobalAllocPtr error" , 0 , MB_OK ) ;
  28. return 0 ;
  29. }
  30. //读出库内容
  31. ReadHuge( hpsLib , dwLibLen ) ;
  32. //关闭文件
  33. Close() ;
  34. lpLibHead =(LIB_HEAD far*)hpsLib ; //得到库头
  35. //判断文件是否正确
  36. if( dwLibLen != lpLibHead->dwLibLen ) //库有问题
  37. {
  38. ::MessageBox( 0 , "The etoc.lib is error" , 0 , MB_OK ) ;
  39. return 0 ;
  40. }
  41. return 1 ;
  42. }
  43. void CEtoC::UnloadDict( void )
  44. {
  45. if( hpsLib )
  46. {
  47. GlobalFreePtr( hpsLib ) ;
  48. hpsLib =NULL ;
  49. }
  50. }
  51. //英汉翻译,返回0,出错,1完全匹配,2非完全匹配
  52. int CEtoC::EnglishToChinese( LPCSTR lpcsEnglish , 
  53. int nLenOfEnglish ,
  54. LPSTR lpsChinese , int nLenOfChinese ,
  55. LPINT lpnLenOfResult )
  56. {
  57. char sBuff[300] ;
  58. if( (UINT)nLenOfEnglish <= 0 || 
  59. (UINT)nLenOfEnglish > lpLibHead->uWordClassNum ) //长度不对
  60. {
  61. strcpy( sBuff , "长度错误!" ) ;
  62. *lpnLenOfResult =min( nLenOfChinese , strlen( sBuff ) ) ;  
  63. _fstrncpy( lpsChinese , sBuff , 
  64.   *lpnLenOfResult ) ;
  65. return 0 ;
  66. }
  67. //检查该类是否有词
  68. if( lpLibHead->dwStartPos[nLenOfEnglish-1] == 0 ||
  69. lpLibHead->dwWordNum[nLenOfEnglish-1] == 0 )
  70. {
  71. strcpy( sBuff , "不好意思,我不会翻译这个词." ) ; 
  72. *lpnLenOfResult =min( nLenOfChinese , strlen( sBuff ) ) ;  
  73. _fstrncpy( lpsChinese , sBuff , 
  74.   *lpnLenOfResult ) ;
  75. return 0 ;
  76. }
  77. //检索该英文单词的含义
  78. DWORD dwItemLen =nLenOfEnglish+5 ; //该词类的项长度
  79. DWORD dwFirst =0 ;
  80. DWORD dwLast =lpLibHead->dwWordNum[nLenOfEnglish-1] - 1 ;
  81. DWORD dwMiddle=0 ;
  82. DWORD dwMiddlePoint=0 ; //中间词的指针
  83. WORD_CLASS far *lpWord ;
  84. int n ;
  85. //以二分法进行检索
  86. while( dwFirst <= dwLast )
  87. {
  88. dwMiddle =( ( dwFirst+dwLast )/2 ) ;
  89. dwMiddlePoint =dwMiddle*dwItemLen ;
  90. n =_fstrnicmp( lpcsEnglish , hpsLib +
  91. lpLibHead->dwStartPos[nLenOfEnglish-1] +
  92. dwMiddlePoint , nLenOfEnglish ) ;
  93. if( !n ) //相等
  94. {
  95. lpWord =(WORD_CLASS far*)( hpsLib + 
  96. lpLibHead->dwStartPos[nLenOfEnglish-1] + 
  97. dwMiddlePoint + nLenOfEnglish ) ;
  98. _fstrncpy( lpsChinese , lpcsEnglish , nLenOfEnglish ) ;
  99. lpsChinese[nLenOfEnglish] =':' ;
  100. if( nLenOfEnglish+1+nLenOfChinese < lpWord->bLen ) //缓冲区长度太小
  101. {
  102. _fstrncpy( lpsChinese+nLenOfEnglish+1 , hpsLib + lpWord->dwStartPos ,
  103.  nLenOfChinese-nLenOfEnglish-1 ) ;
  104. *lpnLenOfResult =nLenOfEnglish+1+nLenOfChinese ;
  105. lpsChinese[*lpnLenOfResult] ='' ;
  106. return 0 ;
  107. }
  108. else
  109. {
  110. _fstrncpy( lpsChinese+nLenOfEnglish+1 , hpsLib + lpWord->dwStartPos ,
  111.  lpWord->bLen ) ;
  112. *lpnLenOfResult =nLenOfEnglish+1+lpWord->bLen ;
  113. lpsChinese[*lpnLenOfResult] ='' ;
  114. return 1 ;
  115. }
  116. }
  117. if( n<0 )
  118. {
  119. if( !dwMiddle ) //已经为0了
  120. break ;
  121. dwLast =dwMiddle-1 ;
  122. }
  123. else
  124. dwFirst =dwMiddle+1 ;
  125. }
  126. //没有匹配者,以中间值代替
  127. //组织输出结果
  128. char far *lp ;
  129. lp =(char far*)sBuff ;
  130. //给英文名字
  131. _fstrncpy( lp , hpsLib +
  132. lpLibHead->dwStartPos[nLenOfEnglish-1] +
  133. dwMiddlePoint , nLenOfEnglish ) ;
  134. lp +=nLenOfEnglish ;
  135. *lp++ =':' ;
  136. //给中文含义
  137. lpWord =(WORD_CLASS far*)( hpsLib + 
  138. lpLibHead->dwStartPos[nLenOfEnglish-1] + 
  139. dwMiddlePoint + nLenOfEnglish ) ;
  140. _fstrncpy( lp , hpsLib + lpWord->dwStartPos , 
  141.  lpWord->bLen ) ;
  142. lp +=lpWord->bLen ;
  143. *lp ='' ;
  144. *lpnLenOfResult =min( nLenOfChinese , strlen( sBuff ) ) ;
  145. _fstrncpy( lpsChinese , sBuff ,
  146.   *lpnLenOfResult ) ;
  147. lpsChinese[*lpnLenOfResult] ='' ;
  148. // WritePrivateProfileString( "test" , "s" , lpsChinese , "test.ini" ) ;
  149. return 2 ;
  150. }
  151. #ifdef __cplusplus
  152. extern "C" {
  153. #endif
  154. //装入翻译字库
  155. BOOL __export FAR PASCAL LoadDict( void )
  156. {
  157. return OEtoC.LoadDict() ;
  158. }
  159. //卸掉翻译字库
  160. void __export FAR PASCAL UnloadDict( void )
  161. {
  162. OEtoC.UnloadDict() ;
  163. }
  164. //对外输出的函数
  165. #define HOU_ZHUI_NUM 6 //后缀数目
  166. #define BUFF_LEN 100
  167. BOOL __export FAR PASCAL EnglishToChinese( LPCSTR lpcsEnglish , 
  168. int nLenOfEnglish ,
  169. LPSTR lpsChinese , int nLenOfChinese ,
  170. LPINT lpnLenOfResult )
  171. {
  172. char sDelStr[HOU_ZHUI_NUM][10]= //减去某部分
  173. { "s" , "es" , "ing" , "ing" , "ed" , "ied" } ;
  174. char sAddStr[HOU_ZHUI_NUM][10]= //减去后,再加上某个部分
  175. { "" , "" , "" , "e" , "" , "y" } ;
  176. int n =OEtoC.EnglishToChinese( lpcsEnglish , nLenOfEnglish ,
  177. lpsChinese , nLenOfChinese , lpnLenOfResult ) ;
  178. if( n==0 || n==1 )
  179. return (BOOL)n ;
  180. char sBuff[BUFF_LEN] ;
  181. int nLen , nDelStr ;
  182. for( int i=0 ; i<HOU_ZHUI_NUM ; i++ )
  183. {
  184. nDelStr =strlen( sDelStr[i] ) ;
  185. if( nLenOfEnglish<=nDelStr )
  186. continue ;
  187. //比较是否有减去的部分
  188. if( _fstrncmp( lpcsEnglish+nLenOfEnglish-nDelStr , sDelStr[i] , nDelStr ) )
  189. continue ; //不相等
  190. nLen =nLenOfEnglish-nDelStr+strlen(sAddStr[i]) ;
  191. if( nLen>BUFF_LEN )
  192. continue ;
  193. _fstrncpy( sBuff , lpcsEnglish , nLenOfEnglish-nDelStr ) ;
  194. strncpy( sBuff+nLenOfEnglish-nDelStr , sAddStr[i] , strlen(sAddStr[i]) ) ;
  195. n =OEtoC.EnglishToChinese( sBuff , nLen ,
  196. lpsChinese , nLenOfChinese , lpnLenOfResult ) ;
  197. if( n==0 || n==1 )
  198. return (BOOL)n ;
  199. }
  200. return OEtoC.EnglishToChinese( lpcsEnglish , nLenOfEnglish ,
  201. lpsChinese , nLenOfChinese , lpnLenOfResult ) ;
  202. }
  203. #ifdef __cplusplus
  204. }
  205. #endif