📄 coding.h
字号:
#ifndef _CODING_H
#define _CODING_H
#pragma warning( disable : 4309 ) // Issue warning 4385
#pragma warning( disable : 4305 ) // Issue warning 4385
CONST CHAR base64_alphabet[]= {
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
'='
};
CONST DWORD base64_dword_value[]= {
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
'='
};
//替换XML元素中关键字符< >
int ReplaceXmlKeyWord(LPCTSTR lpszInput,LPTSTR szOut);
//把汉字格式化为%HH
int URLEncode(LPCTSTR pInBuf,LPTSTR szOut);
// Unicode字符 转换成UTF-8编码
LPCTSTR UnicodeToUTF8Char(LPTSTR pOut,WCHAR wcText);
//GB2312字符串转为UTF-8编码
LPCTSTR GB2312ToUTF8(LPTSTR pUTF8Out,LPCTSTR pGB2312Input, int GB2312Len);
//GB2312字符串转为GB2312网页编码
LPCTSTR GB2312ToWebGB2312(LPTSTR pWebGB2312Out,LPCTSTR pGB2312Input, int GB2312Len);
//去掉空格
LPCTSTR TrimChar(LPTSTR pSrc,CHAR c);
BYTE LMoveBit(int base, int MoveNum)
{
BYTE result=base;
if(MoveNum==0)return 1;
if(MoveNum==1)return MoveNum;
result=base<<(MoveNum-1);
return result;
}
int Base64Encode(LPBYTE pbSrc, DWORD SrcLen, LPBYTE pbDes)
{
LPBYTE pbOut = pbDes;
DWORD dwSrc;
if( SrcLen<=0 ) return 0;
for( DWORD iSrc=0;iSrc<SrcLen;iSrc+=3 ){
dwSrc = *pbSrc++;
dwSrc <<= 8;
dwSrc += *pbSrc++;
dwSrc <<= 8;
dwSrc += *pbSrc++;
*pbOut++ = base64_alphabet[ (dwSrc>>18) & 0x3F ];
*pbOut++ = base64_alphabet[ (dwSrc>>12) & 0x3F ];
*pbOut++ = base64_alphabet[ (dwSrc>>6) & 0x3F ];
*pbOut++ = base64_alphabet[ (dwSrc) & 0x3F ];
}
iSrc -= SrcLen;
if( SrcLen==1 ){//需要补2位
*(pbOut-1) = *(pbOut-2) = '=';
}else if( SrcLen==2 ){//需要补1位
*(pbOut-1) = '=';
}
*pbOut = 0;
iSrc = (int)(pbOut-pbDes);
return iSrc;
}
int Base64Decode(LPBYTE pbSrc, DWORD SrcLen, LPBYTE pbDes)
{
char base64_decode_map[256] = {
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
255, 0, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
};
LPBYTE pbOut = pbDes;
DWORD b1,b2,b3,b4;
for( DWORD iSrc=0;iSrc<SrcLen;iSrc+=4 ){
b1 = *pbSrc++;
b2 = *pbSrc++;
b3 = *pbSrc++;
b4 = *pbSrc++;
*pbDes++ = base64_decode_map[b1]<<2 | base64_decode_map[b2]>>4;
*pbDes++ = base64_decode_map[b2]<<4 | base64_decode_map[b3]>>2;
*pbDes++ = base64_decode_map[b3]<<6 | base64_decode_map[b4];
}
if( SrcLen ){
if( *--pbSrc=='=' ){
--pbDes;
if( *--pbSrc=='=' ) --pbDes;
}
}
*pbDes = 0;
return (int)(pbDes-pbOut);
}
LPCTSTR TrimChar(LPTSTR pSrc,CHAR c)
{
for( LPTSTR p = pSrc; *p ; p++){
if( *p==c ) strcpy( p, p+1);
}
return pSrc;
}
int ReplaceXmlKeyWord(LPCTSTR lpszInput,LPTSTR szOut)
{
char sDst1[] = "〈";
char sDst2[] = "〉";
LPCTSTR pInput = lpszInput;
LPTSTR pOutput = szOut;
while( *pInput ){
switch( *pInput ){
case '<': strcpy(pOutput, sDst1); pOutput += strlen(sDst1); ++pInput; break;
case '>': strcpy(pOutput, sDst2); pOutput += strlen(sDst2); ++pInput; break;
default: *pOutput++ = *pInput++;
}
}
*pOutput = 0;
return (int)(pOutput-szOut);
}
//把汉字格式化为%HH
BYTE toHex(const BYTE x){return x>9?x+55:x+48;}
int URLEncode(LPCTSTR pInBuf,LPTSTR szOut)
{
LPBYTE pInTmp,pOutTmp;
pInTmp = (LPBYTE)pInBuf;
pOutTmp = (LPBYTE)szOut;
while (*pInTmp){
if(isalnum(*pInTmp)){
*pOutTmp++ = *pInTmp;
}else{
if(isspace(*pInTmp)){
*pOutTmp++ = '+';
}else{
*pOutTmp++ = '%';
*pOutTmp++ = toHex(*pInTmp>>4);
*pOutTmp++ = toHex(*pInTmp&0xF);
}
}
pInTmp++;
}
*pOutTmp = '\0';
return (int)(pOutTmp-(LPBYTE)szOut);
}
// Unicode字符 转换成UTF-8编码
LPCTSTR UnicodeToUTF8Char(LPTSTR pOut,WCHAR wcText)
{
// 注意 WCHAR高低字的顺序,低字节在前,高字节在后
LPTSTR pchar = (LPTSTR)&wcText;
pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
pOut[2] = (0x80 | (pchar[0] & 0x3F));
pOut[3] = '\0';
return pOut;
}
//GB2312字符串转为UTF-8编码
LPCTSTR GB2312ToUTF8(LPTSTR pUTF8Out,LPCTSTR pGB2312Input, int GB2312Len)
{
CHAR buf[4];
LPCTSTR lpReturn,pGB2312Cursor,pGB2312InputEnd;
WCHAR wcBuffer;
lpReturn = (LPCTSTR)pUTF8Out;
pGB2312Cursor = (LPTSTR)pGB2312Input;
pGB2312InputEnd= pGB2312Cursor + GB2312Len;
while( pGB2312Cursor<pGB2312InputEnd ){
//如果ANSII直接复制就可以
if( *pGB2312Cursor>0 ){
*pUTF8Out++ = *pGB2312Cursor++;
}else{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,pGB2312Cursor,2,&wcBuffer,1);
memcpy( pUTF8Out, UnicodeToUTF8Char(buf,wcBuffer), 3 );
pGB2312Cursor += 2;
pUTF8Out += 3;
}
}
*pUTF8Out = '\0';
return lpReturn;
}
//GB2312字符串转为GB2312网页编码
LPCTSTR GB2312ToWebGB2312(LPTSTR pWebGB2312Out,LPCTSTR pGB2312Input, int GB2312Len)
{
LPCTSTR lpReturn,pGB2312Cursor,pGB2312InputEnd;
WCHAR wcBuffer;
lpReturn = (LPCTSTR)pWebGB2312Out;
pGB2312Cursor = (LPTSTR)pGB2312Input;
pGB2312InputEnd= pGB2312Cursor + GB2312Len;
while( pGB2312Cursor<pGB2312InputEnd ){
//如果ANSII直接复制就可以
if( *pGB2312Cursor>0 ){
*pWebGB2312Out++ = *pGB2312Cursor++;
}else{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,pGB2312Cursor,2,&wcBuffer,1);
pWebGB2312Out += sprintf( pWebGB2312Out, "&#%d;", wcBuffer);
pGB2312Cursor += 2;
}
}
*pWebGB2312Out = '\0';
return lpReturn;
}
const char g_cHexChar[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
LPCTSTR GBK_EnCode(LPCTSTR lpszAnsi, LPTSTR szGBK)
{
LPTSTR szRet = szGBK;
BYTE num;
for( LPBYTE pb = (LPBYTE)lpszAnsi;*pb;pb++){
if( *pb&0x80 ){ //汉字
num = *pb|0x80;
}else{
num = *pb;
}
if( num&0xF0 ){
*szGBK++ = g_cHexChar[num>>4];
}else{
*szGBK++ = '0';
}
*szGBK++ = g_cHexChar[num&0x0F];
}
*szGBK = '\0';
return szRet;
}
LPCTSTR GBK_DeCode(LPCTSTR lpszGBK, LPTSTR szAnsi)
{
LPTSTR szRet = szAnsi;
BYTE bt;
for( LPCH pc = (LPCH)lpszGBK;*pc;pc+=2){
bt = 0;
switch( *pc ){
case '0': bt|=0x00; break;
case '1': bt|=0x10; break;
case '2': bt|=0x20; break;
case '3': bt|=0x30; break;
case '4': bt|=0x40; break;
case '5': bt|=0x50; break;
case '6': bt|=0x60; break;
case '7': bt|=0x70; break;
case '8': bt|=0x80; break;
case '9': bt|=0x90; break;
case 'A':
case 'a': bt|=0xA0; break;
case 'B':
case 'b': bt|=0xB0; break;
case 'C':
case 'c': bt|=0xC0; break;
case 'D':
case 'd': bt|=0xD0; break;
case 'E':
case 'e': bt|=0xE0; break;
case 'F':
case 'f': bt|=0xF0; break;
default: *szRet = '\0'; return szRet;
}
switch( *(pc+1) ){
case '0': bt|=0x0; break;
case '1': bt|=0x1; break;
case '2': bt|=0x2; break;
case '3': bt|=0x3; break;
case '4': bt|=0x4; break;
case '5': bt|=0x5; break;
case '6': bt|=0x6; break;
case '7': bt|=0x7; break;
case '8': bt|=0x8; break;
case '9': bt|=0x9; break;
case 'A':
case 'a': bt|=0xA; break;
case 'B':
case 'b': bt|=0xB; break;
case 'C':
case 'c': bt|=0xC; break;
case 'D':
case 'd': bt|=0xD; break;
case 'E':
case 'e': bt|=0xE; break;
case 'F':
case 'f': bt|=0xF; break;
default: *szRet = '\0'; return szRet;
}
*szAnsi++ = (CHAR)bt;
}
*szAnsi++ = '\0';
return szRet;
}
int UTF8_2_GBK(const char* pUTF8, LPSTR pGBK)
{
WCHAR wcs[4096];
LPWSTR pUCS2 = wcs;
if (pUTF8 == NULL){
*pUCS2 = 0;
return 0;
}
int size_s = strlen(pUTF8);
int size_d = size_s + 10; //?
int s = 0, d = 0;
bool toomuchbyte = true; //set true to skip error prefix.
while (s < size_s && d < size_d)
{
unsigned char c = pUTF8[s];
if ((c & 0x80) == 0)
{
pUCS2[d++] += pUTF8[s++];
}
else if((c & 0xE0) == 0xC0) ///< 110x-xxxx 10xx-xxxx
{
WCHAR &wideChar = pUCS2[d++];
wideChar = (pUTF8[s + 0] & 0x3F) << 6;
wideChar |= (pUTF8[s + 1] & 0x3F);
s += 2;
}
else if((c & 0xF0) == 0xE0) ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
{
WCHAR &wideChar = pUCS2[d++];
wideChar = (pUTF8[s + 0] & 0x1F) << 12;
wideChar |= (pUTF8[s + 1] & 0x3F) << 6;
wideChar |= (pUTF8[s + 2] & 0x3F);
s += 3;
}
else if((c & 0xF8) == 0xF0) ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
{
WCHAR &wideChar = pUCS2[d++];
wideChar = (pUTF8[s + 0] & 0x0F) << 18;
wideChar = (pUTF8[s + 1] & 0x3F) << 12;
wideChar |= (pUTF8[s + 2] & 0x3F) << 6;
wideChar |= (pUTF8[s + 3] & 0x3F);
s += 4;
}
else
{
WCHAR &wideChar = pUCS2[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
wideChar = (pUTF8[s + 0] & 0x07) << 24;
wideChar = (pUTF8[s + 1] & 0x3F) << 18;
wideChar = (pUTF8[s + 2] & 0x3F) << 12;
wideChar |= (pUTF8[s + 3] & 0x3F) << 6;
wideChar |= (pUTF8[s + 4] & 0x3F);
s += 5;
}
}
pUCS2[d] = 0;
int iLen = WideCharToMultiByte( CP_ACP, 0, pUCS2, d, pGBK, size_d, NULL, NULL );
if( iLen==0 )
iLen = GetLastError();
return iLen;
}
int UTF8_2_UCS2(const char* pUTF8, LPWSTR pUCS2)
{
if (pUTF8 == NULL){
*pUCS2 = 0;
return 0;
}
int size_s = strlen(pUTF8);
int size_d = size_s + 10; //?
int s = 0, d = 0;
bool toomuchbyte = true; //set true to skip error prefix.
while (s < size_s && d < size_d)
{
unsigned char c = pUTF8[s];
if ((c & 0x80) == 0)
{
pUCS2[d++] += pUTF8[s++];
}
else if((c & 0xE0) == 0xC0) ///< 110x-xxxx 10xx-xxxx
{
WCHAR &wideChar = pUCS2[d++];
wideChar = (pUTF8[s + 0] & 0x3F) << 6;
wideChar |= (pUTF8[s + 1] & 0x3F);
s += 2;
}
else if((c & 0xF0) == 0xE0) ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
{
WCHAR &wideChar = pUCS2[d++];
wideChar = (pUTF8[s + 0] & 0x1F) << 12;
wideChar |= (pUTF8[s + 1] & 0x3F) << 6;
wideChar |= (pUTF8[s + 2] & 0x3F);
s += 3;
}
else if((c & 0xF8) == 0xF0) ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
{
WCHAR &wideChar = pUCS2[d++];
wideChar = (pUTF8[s + 0] & 0x0F) << 18;
wideChar = (pUTF8[s + 1] & 0x3F) << 12;
wideChar |= (pUTF8[s + 2] & 0x3F) << 6;
wideChar |= (pUTF8[s + 3] & 0x3F);
s += 4;
}
else
{
WCHAR &wideChar = pUCS2[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
wideChar = (pUTF8[s + 0] & 0x07) << 24;
wideChar = (pUTF8[s + 1] & 0x3F) << 18;
wideChar = (pUTF8[s + 2] & 0x3F) << 12;
wideChar |= (pUTF8[s + 3] & 0x3F) << 6;
wideChar |= (pUTF8[s + 4] & 0x3F);
s += 5;
}
}
pUCS2[d] = 0;
return d;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -