⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multcode.cpp

📁 支持Windows 3.x、Windows 9x平台上的中文(GB、Big5)、日文(Shift JIS、EUC JIS)、韩文(KS C 5601)、HZ码的显示与输入,智能内码识别
💻 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 + -