DWORD CConFilter::OnPreprocHeaders(CHttpFilterContext* pCtxt,
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
{
TCHAR lszBuf[512]
DWORD llvalue=512;
if(pHeaderInfo->GetHeader(pCtxt->m_pFC,"url",lszBuf,&llvalue))
{
ISAPITRACE0(lszBuf); //
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}通过上面的方法,URL中有中文,输出得到 "/PM/%E4%B8%AD%E6%96%87/Default.htm"
这样一串乱码,如何处理?
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
{
TCHAR lszBuf[512]
DWORD llvalue=512;
if(pHeaderInfo->GetHeader(pCtxt->m_pFC,"url",lszBuf,&llvalue))
{
ISAPITRACE0(lszBuf); //
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}通过上面的方法,URL中有中文,输出得到 "/PM/%E4%B8%AD%E6%96%87/Default.htm"
这样一串乱码,如何处理?
{
int i,j;
char ch;
for( i=0,j=0; pszUnicode[j]; ++i,++j)
{
if( ((pszUnicode[i] = pszUnicode[j]) == '%'))//Hex to ASCII
{
ch =(pszUnicode[j+1]>='A' ? ((pszUnicode[j+1] & 0xDF)-'A')+10 : (pszUnicode[j+1]-'0'));
ch *= 16;
ch +=(pszUnicode[j+2]>='A' ? ((pszUnicode[j+2] & 0xDF)-'A')+10 : (pszUnicode[j+2]-'0'));
pszUnicode[i] = ch;
j+=2;
}
}
pszUnicode[i] = '\0'; return pszUnicode;
}
如:%E4%B8%AD 对应"中"
%E5%9B%BD 对应"国"
这种你处理过吗,如果方便,线上交流下
我的联系方式: MSN:[email protected]
{
//return (((ch1>'A')?((ch1-'A')+10):(ch1-'0'))<<4) |
// ((ch2>'A')?((ch2-'A')+10):(ch2-'0'));
BYTE bt1,bt2; switch (ch2)
{
case _T('0'):
bt2 = 0x00;
break;
case _T('1'):
bt2 = 0x01;
break;
case _T('2'):
bt2 = 0x02;
break;
case _T('3'):
bt2 = 0x03;
break;
case _T('4'):
bt2 = 0x04;
break;
case _T('5'):
bt2 = 0x05;
break;
case _T('6'):
bt2 = 0x06;
break;
case _T('7'):
bt2 = 0x07;
break;
case _T('8'):
bt2 = 0x08;
break;
case _T('9'):
bt2 = 0x09;
break;
case _T('A'):
bt2 = 0x0A;
break;
case _T('B'):
bt2 = 0x0B;
break;
case _T('C'):
bt2 = 0x0C;
break;
case _T('D'):
bt2 = 0x0D;
break;
case _T('E'):
bt2 = 0x0E;
break;
case _T('F'):
bt2 = 0x0F;
break;
} switch (ch1)
{
case _T('0'):
bt1 = 0x00;
break;
case _T('1'):
bt1 = 0x10;
break;
case _T('2'):
bt1 = 0x20;
break;
case _T('3'):
bt1 = 0x30;
break;
case _T('4'):
bt1 = 0x40;
break;
case _T('5'):
bt1 = 0x50;
break;
case _T('6'):
bt1 = 0x60;
break;
case _T('7'):
bt1 = 0x70;
break;
case _T('8'):
bt1 = 0x80;
break;
case _T('9'):
bt1 = 0x90;
break;
case _T('A'):
bt1 = 0xA0;
break;
case _T('B'):
bt1 = 0xB0;
break;
case _T('C'):
bt1 = 0xC0;
break;
case _T('D'):
bt1 = 0xD0;
break;
case _T('E'):
bt1 = 0xE0;
break;
case _T('F'):
bt1 = 0xF0;
break;
} BYTE btFinal = bt2 | bt1; return btFinal; }CString DecodeFromUTF8(LPCTSTR szSource)
{
TRACE(_T("\n")); int n, nMax = _tcslen(szSource);
WORD ch; CString lstrFinal;
wchar_t lwchar=0; BYTE z, y, x, w, v, u;
for (n = 0; n < nMax; ++n)
{
char lszAscii[4] = {0};
ch = (WORD)szSource[n]; if (ch != _T('%'))
{
lstrFinal += (char)ch;
continue;
} if (n >= nMax - 2) break; // something is wrong
z = MakeByte(szSource[n+1], szSource[n+2]); if (z < 127)
{
lstrFinal += (char)z;
n = n + 2;
}
else if (z >= 192 && z <= 223)
{
// character is two bytes
if (n >= nMax - 5) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
lwchar = (wchar_t)( (z-192)*64 + (y-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
//convert;
n = n + 5;
}
else if (z >= 224 && z <= 239)
{
// character is three bytes
if (n >= nMax - 8) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
x = MakeByte(szSource[n+7], szSource[n+8]);
lwchar = (wchar_t)( (z-224)*4096 + (y-128)*64 + (x-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
n = n + 8;
}
else if (z >= 240 && z <= 247)
{
// character is four bytes
if (n >= nMax - 11) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
x = MakeByte(szSource[n+7], szSource[n+8]);
w = MakeByte(szSource[n+10], szSource[n+11]);
lwchar = (wchar_t)( (z-240)*262144 + (y-128)*4096 + (x-128)*64 + (w-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
n = n + 11;
}
else if (z >= 248 && z <= 251)
{
// character is four bytes
if (n >= nMax - 14) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
x = MakeByte(szSource[n+7], szSource[n+8]);
w = MakeByte(szSource[n+10], szSource[n+11]);
v = MakeByte(szSource[n+13], szSource[n+14]);
lwchar = (wchar_t)( (z-248)*16777216 + (y-128)*262144 + (x-128)*4096 + (w-128)*64 + (v-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
n = n + 14;
}
else if (z >= 252 && z <= 253)
{
// character is four bytes
if (n >= nMax - 17) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
x = MakeByte(szSource[n+7], szSource[n+8]);
w = MakeByte(szSource[n+10], szSource[n+11]);
v = MakeByte(szSource[n+13], szSource[n+14]);
u = MakeByte(szSource[n+16], szSource[n+17]);
lwchar = (wchar_t)( (z-252)*1073741824 + (y-128)*16777216 + (x-128)*262144 + (w-128)*4096 + (v-128)*64 + (u-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
n = n + 17;
}
} return lstrFinal;
}
费了好大功夫,搞定!BYTE MakeByte(TCHAR ch1, TCHAR ch2)
{
//return (((ch1>'A')?((ch1-'A')+10):(ch1-'0'))<<4) |
//((ch2>'A')?((ch2-'A')+10):(ch2-'0'));
BYTE bt1,bt2;switch (ch2)
{
case _T('0'):
bt2 = 0x00;
break;
case _T('1'):
bt2 = 0x01;
break;
case _T('2'):
bt2 = 0x02;
break;
case _T('3'):
bt2 = 0x03;
break;
case _T('4'):
bt2 = 0x04;
break;
case _T('5'):
bt2 = 0x05;
break;
case _T('6'):
bt2 = 0x06;
break;
case _T('7'):
bt2 = 0x07;
break;
case _T('8'):
bt2 = 0x08;
break;
case _T('9'):
bt2 = 0x09;
break;
case _T('A'):
bt2 = 0x0A;
break;
case _T('B'):
bt2 = 0x0B;
break;
case _T('C'):
bt2 = 0x0C;
break;
case _T('D'):
bt2 = 0x0D;
break;
case _T('E'):
bt2 = 0x0E;
break;
case _T('F'):
bt2 = 0x0F;
break;
}switch (ch1)
{
case _T('0'):
bt1 = 0x00;
break;
case _T('1'):
bt1 = 0x10;
break;
case _T('2'):
bt1 = 0x20;
break;
case _T('3'):
bt1 = 0x30;
break;
case _T('4'):
bt1 = 0x40;
break;
case _T('5'):
bt1 = 0x50;
break;
case _T('6'):
bt1 = 0x60;
break;
case _T('7'):
bt1 = 0x70;
break;
case _T('8'):
bt1 = 0x80;
break;
case _T('9'):
bt1 = 0x90;
break;
case _T('A'):
bt1 = 0xA0;
break;
case _T('B'):
bt1 = 0xB0;
break;
case _T('C'):
bt1 = 0xC0;
break;
case _T('D'):
bt1 = 0xD0;
break;
case _T('E'):
bt1 = 0xE0;
break;
case _T('F'):
bt1 = 0xF0;
break;
}BYTE btFinal = bt2 | bt1;return btFinal;}CString DecodeFromUTF8(LPCTSTR szSource)
{
TRACE(_T("\n"));int n, nMax = _tcslen(szSource);
WORD ch;CString lstrFinal;
wchar_t lwchar=0;BYTE z, y, x, w, v, u;for (n = 0; n < nMax; ++n)
{
char lszAscii[4] = {0};
ch = (WORD)szSource[n];if (ch != _T('%'))
{
lstrFinal += (char)ch;
continue;
}if (n >= nMax - 2) break; // something is wrong
z = MakeByte(szSource[n+1], szSource[n+2]);if (z < 127)
{
lstrFinal += (char)z;
n = n + 2;
}
else if (z >= 192 && z <= 223)
{
// character is two bytes
if (n >= nMax - 5) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
lwchar = (wchar_t)( (z-192)*64 + (y-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
//convert;
n = n + 5;
}
else if (z >= 224 && z <= 239)
{
// character is three bytes
if (n >= nMax - 8) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
x = MakeByte(szSource[n+7], szSource[n+8]);
lwchar = (wchar_t)( (z-224)*4096 + (y-128)*64 + (x-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
n = n + 8;
}
else if (z >= 240 && z <= 247)
{
// character is four bytes
if (n >= nMax - 11) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
x = MakeByte(szSource[n+7], szSource[n+8]);
w = MakeByte(szSource[n+10], szSource[n+11]);
lwchar = (wchar_t)( (z-240)*262144 + (y-128)*4096 + (x-128)*64 + (w-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
n = n + 11;
}
else if (z >= 248 && z <= 251)
{
// character is four bytes
if (n >= nMax - 14) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
x = MakeByte(szSource[n+7], szSource[n+8]);
w = MakeByte(szSource[n+10], szSource[n+11]);
v = MakeByte(szSource[n+13], szSource[n+14]);
lwchar = (wchar_t)( (z-248)*16777216 + (y-128)*262144 + (x-128)*4096 + (w-128)*64 + (v-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
n = n + 14;
}
else if (z >= 252 && z <= 253)
{
// character is four bytes
if (n >= nMax - 17) break; // something is wrong
y = MakeByte(szSource[n+4], szSource[n+5]);
x = MakeByte(szSource[n+7], szSource[n+8]);
w = MakeByte(szSource[n+10], szSource[n+11]);
v = MakeByte(szSource[n+13], szSource[n+14]);
u = MakeByte(szSource[n+16], szSource[n+17]);
lwchar = (wchar_t)( (z-252)*1073741824 + (y-128)*16777216 + (x-128)*262144 + (w-128)*4096 + (v-128)*64 + (u-128) );
WideCharToMultiByte( CP_ACP, 0, (WCHAR*)&lwchar, -1,
lszAscii, 2, NULL, NULL );
lstrFinal +=lszAscii;
n = n + 17;
}}return lstrFinal;
}