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

多国语言处理

开发平台:

Visual C++

  1. //各种内码输入法
  2. #include "stdafx.h"
  3. #include "cspublic.h"
  4. #include "csinput.h"
  5. #include "getcode.h"
  6. static unsigned char c1 , c2 ; //记录翻页位置
  7. int nPages , nPageStep ; //记录翻页次数和最后一次翻页的步长
  8. //把16进制字符转换成10进制整型
  9. int CharToInt( char c )
  10. {
  11. if( c>='0' && c<='9' ) //是数字
  12. return( c-'0' ) ;
  13. if( c>='a' && c<='f' ) //是16进制数
  14. return( c-'a'+10 ) ;
  15. if( c>='A' && c<='F' )
  16. return( c-'A'+10 ) ;
  17. return -1 ;
  18. }
  19. //-------------------------------------------------------------------------------------------------------//
  20. //判断GB内码是否合法
  21. BOOL JudgeGBCode( LPCSTR lpcsInput , int nLenOfInput )
  22. {
  23. int n ;
  24. switch( nLenOfInput )
  25. {
  26. case 1: //左边第一位
  27. n =CharToInt( lpcsInput[0] ) ;
  28. if( n>=0xa && n<=0xf )
  29. return 1 ;
  30. return 0 ;
  31. case 2: //左边第二位
  32. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  33. if( (n>=0xa1 && n<=0xa9) || (n>=0xb0 && n<=0xf7) )
  34. return 1 ;
  35. return 0 ;
  36. case 3: //左边第三位
  37. //先判断第一字节
  38. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  39. if( !((n>=0xa1 && n<=0xa9) || (n>=0xb0 && n<=0xf7)) )
  40. return 0 ;
  41. n =CharToInt( lpcsInput[2] ) ;
  42. if( n>=0xa && n<=0xf )
  43. return 1 ;
  44. return 0 ;
  45. case 4: //左边第四位
  46. //先判断第一字节
  47. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  48. if( !((n>=0xa1 && n<=0xa9) || (n>=0xb0 && n<=0xf7)) )
  49. return 0 ;
  50. n =CharToInt( lpcsInput[2] )*16+CharToInt( lpcsInput[3] ) ;
  51. if( n>=0xa1 && n<=0xfe )
  52. return 1 ;
  53. return 0 ;
  54. }
  55. return 0 ;
  56. }
  57. //根据c1,c2,得到GB码的下一个代码,c1,c2必须正确
  58. BOOL GetNextGBCode( void )
  59. {
  60. if( c2==0xfe ) //c2已经到头
  61. {
  62. if( c1==0xf7 ) //c1也已经到头
  63. return 0 ;
  64. c2 =0xa1 ;
  65. if( c1==0xa9 )
  66. c1 =0xb0 ;
  67. else
  68. c1++ ;
  69. }
  70. else
  71. c2++ ;
  72. return 1 ;
  73. }
  74. //根据c1,c2,得到GB码的上一个代码,c1,c2必须正确
  75. BOOL GetPriorGBCode( void )
  76. {
  77. if( c2==0xa1 ) //c2已经到头
  78. {
  79. if( c1==0xa1 ) //c1也已经到头
  80. return 0 ;
  81. c2 =0xfe ;
  82. if( c1==0xb0 )
  83. c1 =0xa9 ;
  84. else
  85. c1-- ;
  86. }
  87. else
  88. c2-- ;
  89. return 1 ;
  90. }
  91. //初始GB的c1,c2
  92. void InitGBC1C2( LPCSTR lpcsInput , int nLenOfInput )
  93. {
  94. int n ;
  95. switch( nLenOfInput )
  96. {
  97. case 1:
  98. n =CharToInt( lpcsInput[0] ) ;
  99. if( n==0xa )
  100. c1 =0xa1 ;
  101. else
  102. c1 =n*16 ;
  103. c2 =0xa1 ;
  104. break ;
  105. case 2:
  106. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  107. c2 =0xa1 ;
  108. break ;
  109. case 3:
  110. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  111. n =CharToInt( lpcsInput[2] ) ;
  112. if( n==0xa )
  113. c2 =0xa1 ;
  114. else
  115. c2 =n*16 ;
  116. break ;
  117. }
  118. }
  119. //-----------------------------------------------------------------------------------------------//
  120. //判断BIG5内码是否合法
  121. BOOL JudgeBig5Code( LPCSTR lpcsInput , int nLenOfInput )
  122. {
  123. int n ;
  124. switch( nLenOfInput )
  125. {
  126. case 1: //左边第一位
  127. n =CharToInt( lpcsInput[0] ) ;
  128. if( n>=0xa && n<=0xf )
  129. return 1 ;
  130. return 0 ;
  131. case 2: //左边第二位
  132. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  133. if( n>=0xa1 && n<=0xf9)
  134. return 1 ;
  135. return 0 ;
  136. case 3: //左边第三位
  137. //先判断第一字节
  138. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  139. if( n<0xa1 || n>0xf9)
  140. return 0 ;
  141. n =CharToInt( lpcsInput[2] ) ;
  142. if( n>=0x4 && n<=0xf )
  143. return 1 ;
  144. return 0 ;
  145. case 4: //左边第四位
  146. //先判断第一字节
  147. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  148. if( n<0xa1 || n>0xf9)
  149. return 0 ;
  150. n =CharToInt( lpcsInput[2] )*16+CharToInt( lpcsInput[3] ) ;
  151. if( n>=0x40 && n<=0xfe )
  152. return 1 ;
  153. return 0 ;
  154. }
  155. return 0 ;
  156. }
  157. //根据c1,c2,得到BIG5码的下一个代码,c1,c2必须正确
  158. BOOL GetNextBig5Code( void )
  159. {
  160. if( c2==0xfe ) //c2已经到头
  161. {
  162. if( c1==0xf9 ) //c1也已经到头
  163. return 0 ;
  164. c2 =0x40 ;
  165. c1++ ;
  166. }
  167. else
  168. c2++ ;
  169. return 1 ;
  170. }
  171. //根据c1,c2,得到BIG5码的上一个代码,c1,c2必须正确
  172. BOOL GetPriorBig5Code( void )
  173. {
  174. if( c2==0x40 ) //c2已经到头
  175. {
  176. if( c1==0xa1 ) //c1也已经到头
  177. return 0 ;
  178. c2 =0xfe ;
  179. c1-- ;
  180. }
  181. else
  182. c2-- ;
  183. return 1 ;
  184. }
  185. //初始BIG5的c1,c2
  186. void InitBig5C1C2( LPCSTR lpcsInput , int nLenOfInput )
  187. {
  188. int n ;
  189. switch( nLenOfInput )
  190. {
  191. case 1:
  192. n =CharToInt( lpcsInput[0] ) ;
  193. if( n==0xa )
  194. c1 =0xa1 ;
  195. else
  196. c1 =n*16 ;
  197. c2 =0x40 ;
  198. break ;
  199. case 2:
  200. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  201. c2 =0x40 ;
  202. break ;
  203. case 3:
  204. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  205. n =CharToInt( lpcsInput[2] ) ;
  206. c2 =n*16 ;
  207. break ;
  208. }
  209. }
  210. //-----------------------------------------------------------------------------------------//
  211. //判断SHIFT-JIS内码是否合法
  212. BOOL JudgeShiftJisCode( LPCSTR lpcsInput , int nLenOfInput )
  213. {
  214. int n , n1 ;
  215. switch( nLenOfInput )
  216. {
  217. case 1: //左边第一位
  218. n =CharToInt( lpcsInput[0] ) ;
  219. if( n>=0x8 && n<=0xe )
  220. return 1 ;
  221. return 0 ;
  222. case 2: //左边第二位
  223. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  224. if( n>=0x81 && n<=0xea)
  225. return 1 ;
  226. return 0 ;
  227. case 3: //左边第三位
  228. //先判断第一字节
  229. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  230. if( n<0x81 || n>0xea)
  231. return 0 ;
  232. n =CharToInt( lpcsInput[2] ) ;
  233. if( n>=0x4 && n<=0xf )
  234. return 1 ;
  235. return 0 ;
  236. case 4: //左边第四位
  237. //先判断第一字节
  238. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  239. if( n<0x81 || n>0xea)
  240. return 0 ;
  241. n1 =CharToInt( lpcsInput[2] )*16+CharToInt( lpcsInput[3] ) ;
  242. if( n==0xea )
  243. {
  244. if( n1!=0x7f && n1>=0x40 && n1<=0xa2 )
  245. return 1 ;
  246. return 0 ;
  247. }
  248. if( n1!=0x7f && n1>=0x40 && n1<=0xfc )
  249. return 1 ;
  250. return 0 ;
  251. }
  252. return 0 ;
  253. }
  254. //根据c1,c2,得到SHIFT-JIS码的下一个代码,c1,c2必须正确
  255. BOOL GetNextShiftJisCode( void )
  256. {
  257. if( c2==0xfc ) //c2已经到头
  258. {
  259. if( c1==0xea ) //c1也已经到头
  260. return 0 ;
  261. c2 =0x40 ;
  262. c1++ ;
  263. }
  264. else
  265. {
  266. if( c1==0xea && c2==0xa2 ) //已经到头
  267. return 0 ;
  268. c2++ ;
  269. if( c2==0x7f )
  270. c2++ ; //跳过0x7f
  271. }
  272. return 1 ;
  273. }
  274. //根据c1,c2,得到Shift-Jis码的上一个代码,c1,c2必须正确
  275. BOOL GetPriorShiftJisCode( void )
  276. {
  277. if( c2==0x40 ) //c2已经到头
  278. {
  279. if( c1==0x81 ) //c1也已经到头
  280. return 0 ;
  281. c2 =0xfc ;
  282. c1-- ;
  283. }
  284. else
  285. c2-- ;
  286. return 1 ;
  287. }
  288. //初始Shift-Jis的c1,c2
  289. void InitShiftJisC1C2( LPCSTR lpcsInput , int nLenOfInput )
  290. {
  291. int n ;
  292. switch( nLenOfInput )
  293. {
  294. case 1:
  295. n =CharToInt( lpcsInput[0] ) ;
  296. if( n==0x8 )
  297. c1 =0x81 ;
  298. else
  299. c1 =n*16 ;
  300. c2 =0x40 ;
  301. break ;
  302. case 2:
  303. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  304. c2 =0x40 ;
  305. break ;
  306. case 3:
  307. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  308. n =CharToInt( lpcsInput[2] ) ;
  309. c2 =n*16 ;
  310. break ;
  311. }
  312. }
  313. //------------------------------------------------------------------------------------------------//
  314. //判断EUC-JIS内码是否合法
  315. BOOL JudgeEucJisCode( LPCSTR lpcsInput , int nLenOfInput )
  316. {
  317. int n , n1 ;
  318. switch( nLenOfInput )
  319. {
  320. case 1: //左边第一位
  321. n =CharToInt( lpcsInput[0] ) ;
  322. if( n>=0xa && n<=0xf )
  323. return 1 ;
  324. return 0 ;
  325. case 2: //左边第二位
  326. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  327. if( n>=0xa1 && n<=0xf4 )
  328. return 1 ;
  329. return 0 ;
  330. case 3: //左边第三位
  331. //先判断第一字节
  332. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  333. if( n<0xa1 || n>0xf4 )
  334. return 0 ;
  335. n =CharToInt( lpcsInput[2] ) ;
  336. if( n>=0xa && n<=0xf )
  337. return 1 ;
  338. return 0 ;
  339. case 4: //左边第四位
  340. //先判断第一字节
  341. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  342. if( n<0xa1 && n>0xf4 )
  343. return 0 ;
  344. n1 =CharToInt( lpcsInput[2] )*16+CharToInt( lpcsInput[3] ) ;
  345. if( n==0xf4 )
  346. {
  347. if( n1>=0xa1 && n1<=0xa4 )
  348. return 1 ;
  349. return 0 ;
  350. }
  351. if( n>=0xa1 && n<=0xfe )
  352. return 1 ;
  353. return 0 ;
  354. }
  355. return 0 ;
  356. }
  357. //根据c1,c2,得到EUC-JIS码的下一个代码,c1,c2必须正确
  358. BOOL GetNextEucJisCode( void )
  359. {
  360. if( c2==0xfe ) //c2已经到头
  361. {
  362. if( c1==0xf4 ) //c1也已经到头
  363. return 0 ;
  364. c2 =0xa1 ;
  365. c1++ ;
  366. }
  367. else
  368. {
  369. if( c1==0xf4 && c2==0xa4 ) //已经到头
  370. return 0 ;
  371. c2++ ;
  372. }
  373. return 1 ;
  374. }
  375. //根据c1,c2,得到EUC-JIS码的上一个代码,c1,c2必须正确
  376. BOOL GetPriorEucJisCode( void )
  377. {
  378. if( c2==0xa1 ) //c2已经到头
  379. {
  380. if( c1==0xa1 ) //c1也已经到头
  381. return 0 ;
  382. c2 =0xfe ;
  383. c1-- ;
  384. }
  385. else
  386. c2-- ;
  387. return 1 ;
  388. }
  389. //初始EUC-JIS的c1,c2
  390. void InitEucJisC1C2( LPCSTR lpcsInput , int nLenOfInput )
  391. {
  392. int n ;
  393. switch( nLenOfInput )
  394. {
  395. case 1:
  396. n =CharToInt( lpcsInput[0] ) ;
  397. if( n==0xa )
  398. c1 =0xa1 ;
  399. else
  400. c1 =n*16 ;
  401. c2 =0xa1 ;
  402. break ;
  403. case 2:
  404. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  405. c2 =0xa1 ;
  406. break ;
  407. case 3:
  408. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  409. n =CharToInt( lpcsInput[2] ) ;
  410. if( n==0xa )
  411. c2 =0xa1 ;
  412. else
  413. c2 =n*16 ;
  414. break ;
  415. }
  416. }
  417. //-----------------------------------------------------------------------------------------------//
  418. //判断KSC5601内码是否合法
  419. BOOL JudgeKsc5601Code( LPCSTR lpcsInput , int nLenOfInput )
  420. {
  421. int n ;
  422. switch( nLenOfInput )
  423. {
  424. case 1: //左边第一位
  425. n =CharToInt( lpcsInput[0] ) ;
  426. if( n>=0xa && n<=0xf )
  427. return 1 ;
  428. return 0 ;
  429. case 2: //左边第二位
  430. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  431. if( n>=0xa1 && n<=0xfd)
  432. return 1 ;
  433. return 0 ;
  434. case 3: //左边第三位
  435. //先判断第一字节
  436. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  437. if( n<0xa1 || n>0xfd)
  438. return 0 ;
  439. n =CharToInt( lpcsInput[2] ) ;
  440. if( n>=0xa && n<=0xf )
  441. return 1 ;
  442. return 0 ;
  443. case 4: //左边第四位
  444. //先判断第一字节
  445. n =CharToInt( lpcsInput[0] )*16+CharToInt( lpcsInput[1] ) ;
  446. if( n<0xa1 || n>0xfd)
  447. return 0 ;
  448. n =CharToInt( lpcsInput[2] )*16+CharToInt( lpcsInput[3] ) ;
  449. if( n>=0xa1 && n<=0xfe )
  450. return 1 ;
  451. return 0 ;
  452. }
  453. return 0 ;
  454. }
  455. //根据c1,c2,得到KSC5601码的下一个代码,c1,c2必须正确
  456. BOOL GetNextKsc5601Code( void )
  457. {
  458. if( c2==0xfe ) //c2已经到头
  459. {
  460. if( c1==0xfd ) //c1也已经到头
  461. return 0 ;
  462. c2 =0xa1 ;
  463. c1++ ;
  464. }
  465. else
  466. c2++ ;
  467. return 1 ;
  468. }
  469. //根据c1,c2,得到KSC5601码的上一个代码,c1,c2必须正确
  470. BOOL GetPriorKsc5601Code( void )
  471. {
  472. if( c2==0xa1 ) //c2已经到头
  473. {
  474. if( c1==0xa1 ) //c1也已经到头
  475. return 0 ;
  476. c2 =0xfe ;
  477. c1-- ;
  478. }
  479. else
  480. c2-- ;
  481. return 1 ;
  482. }
  483. //初始KSC5601的c1,c2
  484. void InitKsc5601C1C2( LPCSTR lpcsInput , int nLenOfInput )
  485. {
  486. int n ;
  487. switch( nLenOfInput )
  488. {
  489. case 1:
  490. n =CharToInt( lpcsInput[0] ) ;
  491. if( n==0xa )
  492. c1 =0xa1 ;
  493. else
  494. c1 =n*16 ;
  495. c2 =0xa1 ;
  496. break ;
  497. case 2:
  498. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  499. c2 =0xa1 ;
  500. break ;
  501. case 3:
  502. c1 =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  503. n =CharToInt( lpcsInput[2] ) ;
  504. if( n==0xa )
  505. c2 =0xa1 ;
  506. else
  507. c2 =n*16 ;
  508. break ;
  509. }
  510. }
  511. //-----------------------------------------------------------------------------------------------//
  512. //内码输入法向下翻页
  513. //返回0:出错或者输入字符不合法
  514. //返回1:只可以向下翻页
  515. //返回2:只可以向上翻页
  516. //返回3:可以向下也可以向上翻页
  517. //返回4:不能进行翻页
  518. int PageNext(  LPCSTR lpcsInput , int nLenOfInput , //输入串和长度
  519. LPSTR lpsOutput , LPINT lpnLenOfOutput ) //输出串和长度
  520. {
  521. int n , i , n1 ;
  522. switch( nLenOfInput )
  523. {
  524. case 1: //只输入了一个字符,除了该字符都可以改变
  525. n =CharToInt( lpcsInput[0] ) ; //得到已经输入的字符值
  526. for( i=0 ; i<10 ; i++ )
  527. {
  528. lpsOutput[i*4] =i+'0' ;
  529. //返回这个编码
  530. lpsOutput[i*4+1] =c1 ;
  531. lpsOutput[i*4+2] =c2 ;
  532. if( i<9 )
  533. lpsOutput[i*4+3] =' ' ;
  534. //得到下一个编码
  535. if( !GetNextCode() ) //已经没有下一个编码了
  536. {
  537. *lpnLenOfOutput =(i+1)*4-1 ;
  538. nPages++ ;
  539. nPageStep =i+1 ;
  540. return 2 ; //只可以向前翻页  
  541. }
  542. //判断下一个编码是否合法
  543. if( (c1/16) != n ) //不合法
  544. {
  545. *lpnLenOfOutput =(i+1)*4-1 ;
  546. nPages++ ;
  547. nPageStep =i+1 ;
  548. return 2 ; //只可以向前翻页  
  549. }
  550. }
  551. *lpnLenOfOutput =i*4-1 ;
  552. nPages++ ;
  553. nPageStep =i ;
  554. return 3 ;
  555. case 2: //只输入了两个字符,除了这两个字符都可以改变
  556. n =c1 ; //不能改变第一个字节
  557. for( i=0 ; i<10 ; i++ )
  558. {
  559. lpsOutput[i*4] =i+'0' ;
  560. //返回这个编码
  561. lpsOutput[i*4+1] =c1 ;
  562. lpsOutput[i*4+2] =c2 ;
  563. if( i<9 )
  564. lpsOutput[i*4+3] =' ' ;
  565. //得到下一个编码
  566. if( !GetNextCode() ) //已经没有下一个编码了
  567. {
  568. *lpnLenOfOutput =(i+1)*4-1 ;
  569. nPages++ ;
  570. nPageStep =i+1 ;
  571. return 2 ; //只可以向前翻页  
  572. }
  573. //判断下一个编码是否合法
  574. if( c1 != n ) //不合法
  575. {
  576. *lpnLenOfOutput =(i+1)*4-1 ;
  577. nPages++ ;
  578. nPageStep =i+1 ;
  579. return 2 ; //只可以向前翻页  
  580. }
  581. }
  582. *lpnLenOfOutput =i*4-1 ;
  583. nPages++ ;
  584. nPageStep =i ;
  585. return 3 ;
  586. case 3: //只输入了三个字符,除了这三个字符都可以改变
  587. n =c1 ; //不能改变第一个字节
  588. n1 =CharToInt( lpcsInput[2] ) ; //不能改变第三位数
  589. for( i=0 ; i<10 ; i++ )
  590. {
  591. lpsOutput[i*4] =i+'0' ;
  592. //返回这个编码
  593. lpsOutput[i*4+1] =c1 ;
  594. lpsOutput[i*4+2] =c2 ;
  595. if( i<9 )
  596. lpsOutput[i*4+3] =' ' ;
  597. //得到下一个编码
  598. if( !GetNextCode() ) //已经没有下一个编码了
  599. {
  600. *lpnLenOfOutput =(i+1)*4-1 ;
  601. nPages++ ;
  602. nPageStep =i+1 ;
  603. return 2 ; //只可以向前翻页  
  604. }
  605. //判断下一个编码是否合法
  606. if( c1 != n || (c2/16!=n1) ) //不合法
  607. {
  608. *lpnLenOfOutput =(i+1)*4-1 ;
  609. nPages++ ;
  610. nPageStep =i+1 ;
  611. return 2 ; //只可以向前翻页  
  612. }
  613. }
  614. *lpnLenOfOutput =i*4-1 ;
  615. nPages++ ;
  616. nPageStep =i ;
  617. return 3 ;
  618. }
  619. return 0 ;
  620. }
  621. //判断内码是否合法
  622. BOOL JudgeCode( LPCSTR lpcsInput , int nLenOfInput )
  623. {
  624. switch( GetInputCode() ) //判断当前的输入内码
  625. {
  626. case 0: //GB
  627. case 2: //HZ
  628. return JudgeGBCode( lpcsInput , nLenOfInput ) ;
  629. case 1: //BIG5
  630. return JudgeBig5Code( lpcsInput , nLenOfInput ) ;
  631. case 3: //SHIFT-JIS
  632. return JudgeShiftJisCode( lpcsInput , nLenOfInput ) ;
  633. case 4: //EUC-JIS
  634. return JudgeEucJisCode( lpcsInput , nLenOfInput ) ;
  635. case 5: //KSC5601
  636. return JudgeKsc5601Code( lpcsInput , nLenOfInput ) ;
  637. }
  638. return 0 ;
  639. }
  640. //根据c1,c2,得到下一个代码,c1,c2必须正确
  641. BOOL GetNextCode( void )
  642. {
  643. switch( GetInputCode() ) //判断当前的输入内码
  644. {
  645. case 0: //GB
  646. case 2: //HZ
  647. return GetNextGBCode() ;
  648. case 1: //BIG5
  649. return GetNextBig5Code() ;
  650. case 3: //SHIFT-JIS
  651. return GetNextShiftJisCode() ;
  652. case 4: //EUC-JIS
  653. return GetNextEucJisCode() ;
  654. case 5: //KSC5601
  655. return GetNextKsc5601Code() ;
  656. }
  657. return 0 ;
  658. }
  659. //根据c1,c2,得到前一个代码
  660. BOOL GetPriorCode( void )
  661. {
  662. switch( GetInputCode() ) //判断当前的输入内码
  663. {
  664. case 0: //GB
  665. case 2: //HZ              
  666. return GetPriorGBCode() ;
  667. case 1: //BIG5
  668. return GetPriorBig5Code() ;
  669. case 3: //SHIFT-JIS
  670. return GetPriorShiftJisCode() ;
  671. case 4: //EUC-JIS
  672. return GetPriorEucJisCode() ;
  673. case 5: //KSC5601
  674. return GetPriorKsc5601Code() ;
  675. }
  676. return 0 ;
  677. }
  678. //初始c1,c2
  679. void InitC1C2( LPCSTR lpcsInput , int nLenOfInput )
  680. {
  681. switch( GetInputCode() ) //判断当前的输入内码
  682. {
  683. case 0: //GB
  684. case 2: //HZ
  685. InitGBC1C2( lpcsInput , nLenOfInput ) ;
  686. return ;
  687. case 1: //BIG5
  688. InitBig5C1C2( lpcsInput , nLenOfInput ) ;
  689. return ;
  690. case 3: //SHIFT-JIS
  691. InitShiftJisC1C2( lpcsInput , nLenOfInput ) ;
  692. return ;
  693. case 4: //EUC-JIS
  694. InitEucJisC1C2( lpcsInput , nLenOfInput ) ;
  695. return ;
  696. case 5: //KSC5601
  697. InitKsc5601C1C2( lpcsInput , nLenOfInput ) ;
  698. return ;
  699. }
  700. }
  701. //--------------------------------------------------------------------------------------------------------//
  702. #ifdef __cplusplus
  703. extern "C" {
  704. #endif
  705. //根据输入的英文内码,得到汉字
  706. //nFlag=0,从头开始查,设置翻页指针
  707. //nFlag=3,向下翻页,改变翻页指针
  708. //nFlag=4,向上翻页
  709. //返回0:出错或者输入字符不合法
  710. //返回1:只可以向下翻页
  711. //返回2:只可以向上翻页
  712. //返回3:可以向下也可以向上翻页
  713. //返回4:不能进行翻页
  714. int __export FAR PASCAL GetHzOfCode(
  715. LPCSTR lpcsInput , int nLenOfInput , //输入串和长度
  716. LPSTR lpsOutput , LPINT lpnLenOfOutput , //输出串和长度
  717. int nFlag )
  718. {
  719. if( nFlag==3 ) //向下翻页
  720. return PageNext( lpcsInput , nLenOfInput , lpsOutput , lpnLenOfOutput ) ;
  721. if( nFlag==4 ) //向上翻页
  722. {
  723. for( int i=0 ; i<10+nPageStep ; i++ ) //往前翻两页
  724. GetPriorCode() ;
  725. nPages -=2 ; //减少两页
  726. //往下翻一页
  727. PageNext( lpcsInput , nLenOfInput , lpsOutput , lpnLenOfOutput ) ;
  728. if( !nPages ) //一页没翻
  729. return 1 ; //只可以向下翻页
  730. return 3 ; //可以向上也可以向下翻页
  731. }
  732.         
  733.         //剩余的就是从头开始查
  734. //判断输入内码是否合法
  735. if( !JudgeCode( lpcsInput , nLenOfInput ) ) //不合法
  736. return 0 ;
  737. if( nLenOfInput==4 ) //长度为4,直接返回
  738. {
  739. lpsOutput[0] ='1' ;
  740. lpsOutput[1] =CharToInt( lpcsInput[0] )*16 + CharToInt( lpcsInput[1] ) ;
  741. lpsOutput[2] =CharToInt( lpcsInput[2] )*16 + CharToInt( lpcsInput[3] ) ;
  742. *lpnLenOfOutput =3 ;
  743. return 1 ;
  744. }
  745. //确定初始的c1,c2
  746. InitC1C2( lpcsInput , nLenOfInput ) ;
  747. //赋值
  748. for( int i=0 ; i<10 ; i++ )
  749. {
  750. lpsOutput[i*4] =i+'0' ;
  751. lpsOutput[i*4+1] =c1 ;
  752. lpsOutput[i*4+2] =c2++ ;
  753. if( i<9 )
  754. lpsOutput[i*4+3] =' ' ;
  755. }
  756. *lpnLenOfOutput =39 ;
  757. nPages =0 ; //初始翻过的页
  758.         return 1 ;
  759. }
  760. #ifdef __cplusplus
  761. }
  762. #endif