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"
这样一串乱码,如何处理?

解决方案 »

  1.   

    char * UnicodeToAscii(LPTSTR pszUnicode)
    {
    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;
    }
      

  2.   

    to  ok1234567(ok1234567) 我试过你这种方法,对这种Unicode URL,取得后是三个符号组成一个中文,
     如:%E4%B8%AD 对应"中"
         %E5%9B%BD 对应"国"
         
    这种你处理过吗,如果方便,线上交流下
    我的联系方式: MSN:[email protected]
      

  3.   

    费了好大功夫,搞定!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;
    }
      

  4.   


    费了好大功夫,搞定!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;
    }