?? 字符轉換.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 + -