MULTCODE.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:6k
- #include "stdafx.h"
- #include <windowsx.h>
- #include "cspublic.h"
- #include "multcode.h"
- CJudgeCode OJudgeCode( JUDGE_LIB_NAME ) ;
- //自动判断,需要怎么处理内码
- //返回0为国标码,1为BIG5码,2,3,4为其它缺省内码
- int JudgeCode( LPSTR lpsStr , int nNum ) //判断为何种内码
- {
- int nResult ;
- if( GetRecGbBig5() ) //需要自动识别GB与BIG5内码
- //判断是何种内码
- nResult =OJudgeCode.JudgeGBorBig5( lpsStr , nNum ) ;
- else //不需要自动识别内码
- {
- nResult =GetOutputCode() ; //得到缺省输出内码
- if( nResult==1 ) //BIG5
- ChangeBig5ToGb( lpsStr , nNum ) ; //转换内码
- }
- if( GetRecHz() ) //需要自动识别HZ码
- OJudgeCode.JudgeHZ( lpsStr , nNum ) ;
-
- return nResult ;
- }
- //--------------------------------------------------------------------------------------------//
- //自动判断是何种内码
- CJudgeCode::CJudgeCode( char * psFileName ):
- CFile( psFileName , CFile::modeRead )
- {
- DWORD dwFileLen =GetLength() ; //得到文件长度
- if( dwFileLen % 4 ) //不能被4整除
- {
- ::MessageBox( 0 , "The length of the file is wrong!" , 0 , MB_OK ) ;
- return ;
- }
- m_nItemNum =(int)(dwFileLen / 4) ; //表中项数
-
- //分配内存
- m_lpsList =(char huge*)GlobalAllocPtr( GMEM_FIXED ,
- dwFileLen ) ;
- if( !m_lpsList )
- {
- ::MessageBox( 0 , "GlobalAllocPtr error" , 0 , MB_OK ) ;
- return ;
- }
-
- //读出词组表
- ReadHuge( m_lpsList , dwFileLen ) ;
-
- Close() ;
- }
- CJudgeCode::~CJudgeCode( void )
- {
- if( m_lpsList )
- GlobalFreePtr( m_lpsList ) ;
- }
- //自动判断字符串是GB码还是BIG5码
- int CJudgeCode::JudgeGBorBig5( LPSTR lpsStr , int nNum )
- {
- //判断其是否为GB码
- if( IsGB( lpsStr , nNum ) )
- return( 0 ) ; //为GB码
- //得到当前缺省内码
- int nResult =GetOutputCode() ;
- if( nResult==1 ) //是BIG5
- {
- ChangeBig5ToGb( lpsStr , nNum ) ; //将其转换为GB码
- return( 1 ) ; //是BIG5
- }
- //输入字符串不是GB码,假设其为BIG5,将其转换为GB码
- LPSTR lpsString =(LPSTR)GlobalAllocPtr( GMEM_FIXED ,
- nNum ) ;
- if( !lpsString )
- {
- ::MessageBox( 0 , "GlobalAllocPtr error,in JudgeCode" , 0 , MB_OK ) ;
- return -1 ;
- }
- _fstrncpy( lpsString , lpsStr , nNum ) ; //复制
- ChangeBig5ToGb( lpsString , nNum ) ;
- //判断转换结果是否是GB码
- if( IsGB( lpsString , nNum ) ) //输入串是BIG5
- {
- _fstrncpy( lpsStr , lpsString , nNum ) ; //复制
- GlobalFreePtr( lpsString ) ;
- return( 1 ) ;
- }
- GlobalFreePtr( lpsString ) ;
- //输入串即不是GB码、也不是BIG5码,以缺省内码GB码为准
- return( nResult ) ;
- }
- //判断字符串是否是GB码
- int CJudgeCode::IsGB( LPSTR lpsStr , int nNum )
- {
- int nLinePoint ; //字符指针
- char sWordBuff[4] ;
- int n ;
-
- nLinePoint =0 ; //设置字符指针
- //得到第一个字
- l100: while( 1 )
- {
- n =GetZi( lpsStr , nNum , (LPINT)&nLinePoint , (LPSTR)sWordBuff ) ;
- if( !n ) //到字符串尾
- return 0 ;
- if( n == 2 ) //连续二个汉字
- break ;
- }
- do
- {
- //得到第二个字
- n =GetZi( lpsStr , nNum , (LPINT)&nLinePoint ,
- (LPSTR)(sWordBuff+2) ) ;
- if( !n ) //到字符串尾
- return 0 ;
-
- //判断该两个字是否能够组成一个词
- if( IsWord( (LPSTR)sWordBuff ) ) //是一个词
- return 1 ; //是GB码
-
- if( n == 2 ) //下面还有一字
- {
- //保存第二个字,即丢弃第一个字,以第二个字为第一个字
- sWordBuff[0] =sWordBuff[2] ;
- sWordBuff[1] =sWordBuff[3] ;
- }
- else //下面已经没有字,要找第一个汉字
- goto l100 ;
- } while( 1 ) ;
- }
- //从字符串中得到一个汉字
- int CJudgeCode::GetZi( LPSTR lpsLine , int nNum ,
- LPINT lpnLinePoint , LPSTR lpsZi )
- {
- for( int i=*lpnLinePoint ; i < nNum-1 ; i++ )
- {
- if( lpsLine[i]&0x80 ) //遇到一个汉字
- {
- //记录该汉字
- lpsZi[0] =lpsLine[i++] ;
- lpsZi[1] =lpsLine[i++] ;
- *lpnLinePoint =i ; //记录指针
- //判断下一个是否也是汉字
- if( i < nNum - 1 ) //还有可能组成汉字
- {
- if( lpsLine[i]&0x80 ) //也是汉字
- return 2 ; //连续两个都是汉字
- }
- return 1 ; //下一个不是汉字
- }
- }
- return 0 ; //找不到汉字
- }
- //判断该几个字是否能够组成一个词
- int CJudgeCode::IsWord( LPSTR lpsWordBuff )
- {
- LONG nFirst=0 ; //表头
- LONG nLast=m_nItemNum-1 ; //表尾
- LONG nMiddle ; //表中
- int n ;
-
- while( nFirst <= nLast )
- {
- nMiddle =( nFirst+nLast )/2 ; //二分
-
- n =_fstrncmp( m_lpsList+nMiddle*4 , lpsWordBuff , 4 ) ;
- if( !n ) //相等
- return 1 ;
-
- if( n < 0 )
- nFirst =nMiddle+1 ;
- else
- nLast =nMiddle-1 ;
- }
-
- return 0 ;
- }
- //判断是否存在HZ码
- void CJudgeCode::JudgeHZ( LPSTR lpsStr , int nNum )
- {
- int nSub =0 ;
-
- for( int i=0 ; i<nNum-1 ; )
- {
- //寻找头
- if( lpsStr[i+nSub] == '~' && lpsStr[i+nSub+1] == '{' ) //是头
- {
- nNum -=2 ; //长度-2
- nSub +=2 ;
- //将头后字符串前移
- while( i<nNum )
- {
- if( i == nNum-1 ) //最后一个字符
- {
- lpsStr[i] =lpsStr[i+nSub] | 128 ;
- break ;
- }
-
- if( lpsStr[i+nSub] == '~' && lpsStr[i+nSub+1] == '}' ) //是尾
- {
- nNum -=2 ; //字符串长度-2
- nSub +=2 ;
-
- break ; //跳出这个循环
- }
-
- switch( lpsStr[i+nSub] )
- {
- case '#': //将其后的英文字符改成中文字符
- lpsStr[i++] =0xa3 ; //第3区为中文字符
- lpsStr[i] =lpsStr[i+nSub] | 128 ;
- break ;
- case '