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

📄 字符转换.h

📁 转换UNCODE为UTF-8字符
💻 H
字号:

int GetBitFromHeader(char chSourceData, int iBitNum)
{
	bool Flag = 0;
	int iData = 0;

	if( iBitNum >= 6 )
		return -1;

	iData = ( chSourceData & 0x80 );
	
	iData &= 0x000000ff; 
	if( iData != 0x80 )
	{
		Flag = 0;
		return Flag;
	}

	chSourceData = chSourceData << iBitNum + 1;
	chSourceData = chSourceData & 0x80;
	Flag = (chSourceData >> 7);
	
	return Flag;
}

void GetValue(char chSourceData, char& chValue)
{
	chSourceData = chSourceData & 0x3F;
	chValue = chSourceData;
}

void GetHeaderValue(char chSourceData, char& chValue, int iBit)
{
	chSourceData = chSourceData << iBit;
	chSourceData = chSourceData >> iBit;
	chValue = chSourceData;
}

void BinToChar( const char chSource, CString& strResult )
{
	char ch = ( chSource & 0x80 ) >> 7;
	if( ch == 0x00 )
		ch = '0';
	else
		ch = '1';
	strResult += ch;

	ch = ( chSource & 0x40 ) >> 6;
	if( ch == 0x00 )
		ch = '0';
	else
		ch = '1';
	strResult += ch;

	ch = ( chSource & 0x20 ) >> 5;
	if( ch == 0x00 )
		ch = '0';
	else
		ch = '1';
	strResult += ch;

	ch = ( chSource & 0x10 ) >> 4;
	if( ch == 0x00 )
		ch = '0';
	else
		ch = '1';
	strResult += ch;

	ch = ( chSource & 0x08 ) >> 3;
	if( ch == 0x00 )
		ch = '0';
	else
		ch = '1';
	strResult += ch;

	ch = ( chSource & 0x04 ) >> 2;
	if( ch == 0x00 )
		ch = '0';
	else
		ch = '1';
	strResult += ch;

	ch = ( chSource & 0x02 ) >> 1;
	if( ch == 0x00 )
		ch = '0';
	else
		ch = '1';
	strResult += ch;

	ch = ( chSource & 0x01 );
	if( ch == 0x00 )
		ch = '0';
	else
		ch = '1';
	strResult += ch;

}

BOOL CharToBin( const CString strSource, char& chResult )
{
	char ch = 0x00;
	int iStrLength = strSource.GetLength();

	if( iStrLength > 8 )
		return FALSE;
	
	chResult = 0x00;

	for( int i = 0; i < iStrLength; i++ )
	{
		chResult = chResult << 1;
		ch = strSource.GetAt( i );
		chResult += atoi( &ch );
	}

	return TRUE;
}

void GetLen(int& iLen)
{
	int iResult = 0;

	iResult = iLen / 8;

	iLen = iResult;
}

void ChangeLtoH(char* chSource, int iSourceLen, char* chResult, int& iResultLen)
{
	char chMiddle = 0x00;

	for( int i = 0; i < iSourceLen && i < iResultLen; i++ )
	{
		chResult[ i + 1 ] = chSource[ i ];
		chResult[ i ] = chSource[ i + 1 ];
		i++;
	}
	iResultLen = iSourceLen;
}

void MakeUp(char * chSourceData, int iSourceLen, char* chResult, int& iResultLen)
{
	CString strResult = "";
	CString strMiddle = "";

	if( iSourceLen == 1 )
	{
		BinToChar( chSourceData[ 0 ], strMiddle );
		strResult += "00000000";
		strResult += strMiddle;
	}
	else
		for( int i = 0; i < iSourceLen; i++ )//多字节
		{
			BinToChar( chSourceData[ i ] , strMiddle );
			strMiddle = strMiddle.Right( 6 );
			strResult += strMiddle;
			strMiddle = "";
		}
	iSourceLen = strResult.GetLength();
	GetLen( iSourceLen );
	for( int i = 0; i < iSourceLen; i++ )
	{
		strMiddle = strResult.Right( 8 );
		CharToBin( strMiddle, chResult[ iSourceLen - i - 1 ] );
		strResult = strResult.Left( strResult.GetLength() - 8 );
	}

	iResultLen = iSourceLen;

} 

void MakeUTF8(CString strSource, char* chResult, int& iResultLen)
{
	int iLen			= 0;
	char ch				= 0x00;
	CString strHeader	= "";
	
	iLen = strSource.GetLength();
	if( iLen == 8 )//单字
	{
		CharToBin( strSource, ch );
		chResult[ 0 ] = ch;
		iResultLen = 1;
		return ;
	}
	//多字
	if( iLen % 6 )
	{
		iLen = iLen / 6;
		iLen++;
	}
	else
		iLen = iLen / 6;

	for( int i = 0; i < iLen; i++ )
	{
		CharToBin( strSource.Right(6), ch );
		chResult[ iLen - i - 1 ] = ch;
		if( i != iLen - 1 )
			chResult[ iLen - i - 1 ] += 0x80; 
		strHeader += "1";
		strSource = strSource.Left( strSource.GetLength() - 6 );
	}
	CharToBin( strHeader, ch );
	ch = ch << (8 - iLen);
	chResult[ 0 ] += ch;

	iResultLen = iLen;

}

void UnicodetoUTF8(char* chUnicode, int iUnicodeLen, char* chUTF8, int& iUTF8Len)
{
	int iLen			= 0;
	int iOneUTF8Len		= 0;
	int iUTF8Pos		= 0;
	CString strMiddle	= "";
	CString strResult	= "";

	iLen = iUTF8Len;
	ChangeLtoH( chUnicode, iUnicodeLen, chUTF8, iLen );
	memcpy( chUnicode, chUTF8, iLen );
	
	for( int i = 0; i < iLen; i++ )
	{
		strMiddle = "";
		BinToChar( chUnicode[ i ], strMiddle );
		if( strMiddle != "00000000" )
			strResult += strMiddle;
		i++;

		strMiddle = "";
		BinToChar( chUnicode[ i ], strMiddle );
		if( strMiddle != "00000000" )
			strResult += strMiddle;

		MakeUTF8( strResult, chUTF8 + iUTF8Pos, iOneUTF8Len );
		iUTF8Pos += iOneUTF8Len;
		strResult = "";
	}

	iUTF8Len = iUTF8Pos;

}

void UTF8toUnicode(char* chUTF8, int iUTF8Len, char* chUnicode, int& iUnicodeLen)
{
	int  iOneLen		= 0;
	int  iFlag			= 0;
	int  iResultLen		= 0;
	int  iUnicodePos	= 0;
	char chHeader		= 0x00;
	char chMiddle		= 0x00;
	char chResult[1024];

	for( int i = 0; i < iUTF8Len; i++ )
	{
		iResultLen = 0;
		chHeader = chUTF8[ i ];
		for( int j = 0; j < 6; j++ )
		{
			switch( j )
			{
				case 0: 
						iFlag = GetBitFromHeader( chHeader, j );
						if( iFlag == 1 )
						{
							GetValue( chUTF8[ j + i + 1 ], chResult[ j + 1 ] );
							iResultLen++;
						}
						break;
				case 1: 
						iFlag = GetBitFromHeader( chHeader, j );
						if( iFlag == 1 )
						{
							GetValue( chUTF8[ j + i + 1 ], chResult[ j + 1 ] );
							iResultLen++;
						}
						break;
				case 2: 
						iFlag = GetBitFromHeader( chHeader, j );
						if( iFlag == 1 )
						{
							GetValue( chUTF8[ j + i + 1 ], chResult[ j + 1 ] );
							iResultLen++;
						}
						break;
				case 3: 
						iFlag = GetBitFromHeader( chHeader, j );
						if( iFlag == 1 )
						{
							GetValue( chUTF8[ j + i + 1 ], chResult[ j + 1 ] );
							iResultLen++;
						}
						break;
				case 4: 
						iFlag = GetBitFromHeader( chHeader, j );
						if( iFlag == 1 )
						{
							GetValue( chUTF8[ j + i + 1 ], chResult[ j + 1 ] );
							iResultLen++;
						}
						break;
				case 5: 
						iFlag = GetBitFromHeader( chHeader, j );
						if( iFlag == 1 )
						{
							GetValue( chUTF8[ j + i + 1 ], chResult[ j + 1 ] );
							iResultLen++;
						}
						break;

				default : break;
			}
			if( iFlag == 0 )
			{
				if( j == 0 )
				{
					chResult[0] = chHeader;
					iResultLen = 1;
				}
				else
				{
					GetHeaderValue( chHeader, chResult[ 0 ], j + 1 );
					iResultLen++;
				}
				iOneLen = iUnicodeLen;
				MakeUp( chResult, iResultLen, chUnicode + iUnicodePos, iOneLen );
				iUnicodePos += iOneLen;
				i += j;
				break;
			}
		}
	}
	ChangeLtoH( chUnicode, iUnicodePos, chResult, iUnicodeLen );
	memcpy( chUnicode, chResult, iUnicodeLen );
	
}

int Covent(char *pS, int npS, char *pD)
{
     //计算转换的字符数936
     int iLen=WideCharToMultiByte (936, 0, (PWSTR) pS, -1, NULL,0, NULL, NULL) ;
     //给pszBig5分配内存
     char *pszBig5=new char[iLen+1];
     //转换Unicode码到Big5码,使用API函数WideCharToMultiByte
     int iDLen = WideCharToMultiByte (936, 0, (PWSTR) pS, -1, pszBig5, iLen, NULL, NULL);

	 memcpy( pD, pszBig5, iDLen );

	 return 0;
}


//////////////////////////////////////////////
void Example()
{
	int iUnicodeLen = 1024;
	int iResultLen = 1024;
	char chUnicode[1024];
	char chResult[1024];
	char chUTF8[1024] = {
0x4D ,0x53 ,0x47 ,0x20 ,0x32 ,0x36 ,0x39 ,0x20 ,0x41 ,0x20 ,
0x31 ,0x36 ,0x34 ,0x0D ,0x0A ,0x4D ,0x49 ,0x4D ,0x45 ,0x2D ,
0x56 ,0x65 ,0x72 ,0x73 ,0x69 ,0x6F ,0x6E ,0x3A ,0x20 ,0x31 ,
0x2E ,0x30 ,0x0D ,0x0A ,0x43 ,0x6F ,0x6E ,0x74 ,0x65 ,0x6E ,
0x74 ,0x2D ,0x54 ,0x79 ,0x70 ,0x65 ,0x3A ,0x20 ,0x74 ,0x65 ,
0x78 ,0x74 ,0x2F ,0x70 ,0x6C ,0x61 ,0x69 ,0x6E ,0x3B ,0x20 ,
0x63 ,0x68 ,0x61 ,0x72 ,0x73 ,0x65 ,0x74 ,0x3D ,0x55 ,0x54 ,
0x46 ,0x2D ,0x38 ,0x0D ,0x0A ,0x58 ,0x2D ,0x4D ,0x4D ,0x53 ,
0x2D ,0x49 ,0x4D ,0x2D ,0x46 ,0x6F ,0x72 ,0x6D ,0x61 ,0x74 ,
0x3A ,0x20 ,0x46 ,0x4E ,0x3D ,0x25 ,0x45 ,0x35 ,0x25 ,0x41 ,
0x45 ,0x25 ,0x38 ,0x42 ,0x25 ,0x45 ,0x34 ,0x25 ,0x42 ,0x44 ,
0x25 ,0x39 ,0x33 ,0x3B ,0x20 ,0x43 ,0x4F ,0x3D ,0x30 ,0x30 ,
0x30 ,0x30 ,0x30 ,0x30 ,0x3B ,0x20 ,0x45 ,0x46 ,0x3D ,0x3B ,
0x20 ,0x50 ,0x46 ,0x3D ,0x32 ,0x32 ,0x0D ,0x0A ,0x0D ,0x0A ,
0xE6 ,0x9C ,0x89 ,0xE6 ,0x9C ,0x89 ,0xE6 ,0x9C ,0x89 ,0xE6 ,
0x9C ,0x89 ,0xE6 ,0x9C ,0x89 ,0xE6 ,0x9C ,0x89 ,0xE6 ,0x9C ,
0x89 ,0xE6 ,0x9C ,0x89 ,0xE6 ,0x9C ,0x89 ,0xE6 ,0x9C ,0x89 ,
0xE6 ,0x9C ,0x89 ,0xE6 ,0x9C ,0x89 ,0xE6 ,0x9C ,0x89 ,0x00 };
//AfxMessageBox( chUTF8 );
//ChangeLtoH( chUTF8, 213, chUnicode, iUnicodeLen );

	UTF8toUnicode( chUTF8, 180, chUnicode, iUnicodeLen );

iResultLen = 1024;
UnicodetoUTF8( chUnicode, iUnicodeLen, chUTF8, iResultLen );
UTF8toUnicode( chUTF8, iResultLen, chUnicode, iUnicodeLen );

	chUnicode[ iUnicodeLen + 1 ] = '\0';
	Covent( chUnicode, iUnicodeLen, chResult );
	AfxMessageBox( chResult );

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -