📄 multcode.cpp
字号:
#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 '
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -