返回数据是网页的源码,是UFT-8的编码的,我想 从 中,找一个字符串。
思路就是把返回的数据转成unicode ,然后再查找字符串。但是把返回数据转成unicode,就成乱码了。我也不知道代码错了,还是思路错了。求解释。
还有就是 %B5%C7%C2%BC ,这种东西是怎么转换的啊,用什么算法?
void CJuBaoDlg::OnBnClickedButtonLogin()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
WCHAR FormData[256] ={0};
wsprintf(FormData,_T("formhash=c81fdb1b&cookietime=2592000&loginfield=username&username=%s&password=%s&userlogin=%%B5%%C7%%C2%%BC"),
                m_strUserName.GetBuffer(m_strUserName.GetLength()+1),m_strUserPwd.GetBuffer(m_strUserPwd.GetLength()+1));

WCHAR Accept[] = _T("Accept: */*");
WCHAR **p = new WCHAR *[2];
*p = Accept;
*(p+1) = NULL; WCHAR Header[] = _T("Content-Type: application/x-www-form-urlencoded");  HINTERNET hSession = InternetOpen(_T("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0E; .NET4.0C)"), 
INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); 
    HINTERNET hConnect = InternetConnect(hSession, _T("bbs.vsa.com.cn"), INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);  HINTERNET hRequest = HttpOpenRequest(hConnect, _T("POST"), _T("/Discuz!/logging.php?action=login&loginsubmit=true"), 
        NULL, NULL, (const WCHAR **)p, 0, 1); 
    int bReturn = HttpSendRequest(hRequest, Header, lstrlen(Header), FormData, lstrlen(FormData));  CString s;
Response(hRequest,s);
//Sleep(5000); //hRequest = HttpOpenRequest(hConnect, _T("GET"), _T("/Discuz!/index.php"), 
               // NULL, NULL, (const WCHAR **)p, 0, 1); 
    //bReturn = HttpSendRequest(hRequest, Header, lstrlen(Header), NULL, NULL); 
//SaveRec(hRequest); // TODO: Add your control notification handler code here
//CDialogEx::OnOK();
}
bool CJuBaoDlg::Response(HINTERNET hRequest,CString &strRec)
{
char szRecvBuf[1025]; // 接受数据缓冲区
DWORD   dwNumberOfBytesRead; // 服务器返回大小
DWORD dwRecvTotalSize=0; // 接受数据总大小
DWORD dwRecvBuffSize=0; // 接受数据buf的大小
int x=0;
//CFile m_File; // 将返回数据写入文件
CString strTemp; // 临时消息框
//CString strRec(_T(""));
memset(szRecvBuf,0,1024); do
{
// 开始读取数据
int bReturn = InternetReadFile(hRequest,szRecvBuf,1024,&dwNumberOfBytesRead);
if(!bReturn)
{
//MessageBox(_T("InternetReadFile Error !"),_T("提示"),MB_ICONERROR | MB_OK);
return false;
} // 统计接受数据的大小
szRecvBuf[dwNumberOfBytesRead] = '\0';
dwRecvTotalSize += dwNumberOfBytesRead;
dwRecvBuffSize  += strlen(szRecvBuf);
int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szRecvBuf, strlen(szRecvBuf), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
::MultiByteToWideChar(CP_UTF8, NULL, szRecvBuf, strlen(szRecvBuf), wszString, wcsLen);
wszString[wcsLen] = '/0'; // 将缓冲区写入文件
strTemp.Format(_T("%s"),szRecvBuf);
strRec += strTemp;
x = strRec.GetLength(); } while(dwNumberOfBytesRead !=0);
if(dwRecvTotalSize != dwRecvBuffSize)
{
return false;
}
else
{ return true; }}

解决方案 »

  1.   

    %B5%C7%C2%BC 这应该是url编码
      

  2.   

    url编码
      怎么转换?怎么把字符串转换成url编码?
      

  3.   


    unsigned int UrlCode::utf8_decode( char *s, unsigned int *pi )
    {
    unsigned int c;
    int i = *pi;
    /* one digit utf-8 */
    if ((s[i] & 128)== 0 ) {
    c = (unsigned int) s[i];
    i += 1;
    } else if ((s[i] & 224)== 192 ) { /* 110xxxxx & 111xxxxx == 110xxxxx */
    c = (( (unsigned int) s[i] & 31 ) << 6) +
    ( (unsigned int) s[i+1] & 63 );
    i += 2;
    } else if ((s[i] & 240)== 224 ) { /* 1110xxxx & 1111xxxx == 1110xxxx */
    c = ( ( (unsigned int) s[i] & 15 ) << 12 ) +
    ( ( (unsigned int) s[i+1] & 63 ) << 6 ) +
    ( (unsigned int) s[i+2] & 63 );
    i += 3;
    } else if ((s[i] & 248)== 240 ) { /* 11110xxx & 11111xxx == 11110xxx */
    c =  ( ( (unsigned int) s[i] & 7 ) << 18 ) +
    ( ( (unsigned int) s[i+1] & 63 ) << 12 ) +
    ( ( (unsigned int) s[i+2] & 63 ) << 6 ) +
    ( (unsigned int) s[i+3] & 63 );
    i+= 4;
    } else if ((s[i] & 252)== 248 ) { /* 111110xx & 111111xx == 111110xx */
    c = ( ( (unsigned int) s[i] & 3 ) << 24 ) +
    ( ( (unsigned int) s[i+1] & 63 ) << 18 ) +
    ( ( (unsigned int) s[i+2] & 63 ) << 12 ) +
    ( ( (unsigned int) s[i+3] & 63 ) << 6 ) +
    ( (unsigned int) s[i+4] & 63 );
    i += 5;
    } else if ((s[i] & 254)== 252 ) { /* 1111110x & 1111111x == 1111110x */
    c = ( ( (unsigned int) s[i] & 1 ) << 30 ) +
    ( ( (unsigned int) s[i+1] & 63 ) << 24 ) +
    ( ( (unsigned int) s[i+2] & 63 ) << 18 ) +
    ( ( (unsigned int) s[i+3] & 63 ) << 12 ) +
    ( ( (unsigned int) s[i+4] & 63 ) << 6 ) +
    ( (unsigned int) s[i+5] & 63 );
    i += 6;
    } else {
    c = '?';
    i++;
    }
    *pi = i;
    return c;
    }std::string UrlCode::UrlEncode(const std::string& src)
    {
    static    char hex[] = "0123456789ABCDEF";
    std::string dst; for (size_t i = 0; i < src.size(); i++)
    {
    unsigned char ch = src[i];
    if (isalnum(ch))
    {
    dst += ch;
    }
    else
    if (src[i] == ' ')
    {
    dst += '+';
    }
    else
    {
    unsigned char c = static_cast<unsigned char>(src[i]);
    dst += '%';
    dst += hex[c / 16];
    dst += hex[c % 16];
    }
    }
    return dst;
    }std::string UrlCode::UrlDecode(const std::string& src)
    {
    std::string dst, dsturl; int srclen = src.size(); for (size_t i = 0; i < srclen; i++)
    {
    if (src[i] == '%')
    {
    if(isxdigit(src[i + 1]) && isxdigit(src[i + 2]))
    {
    char c1 = src[++i];
    char c2 = src[++i];
    c1 = c1 - 48 - ((c1 >= 'A') ? 7 : 0) - ((c1 >= 'a') ? 32 : 0);
    c2 = c2 - 48 - ((c2 >= 'A') ? 7 : 0) - ((c2 >= 'a') ? 32 : 0);
    dst += (unsigned char)(c1 * 16 + c2);
    }
    }
    else
    if (src[i] == '+')
    {
    dst += ' ';
    }
    else
    {
    dst += src[i];
    }
    } int len = dst.size(); for(unsigned int pos = 0; pos < len;)
    {
    unsigned int nvalue = utf8_decode((char *)dst.c_str(), &pos);
    dsturl += (unsigned char)nvalue;
    } return dsturl;
    }
      

  4.   

    utf8_decode
     这个是干什么的? 没看懂。
      

  5.   

     ::MultiByteToWideChar(CP_ACP, NULL, szRecvBuf, strlen(szRecvBuf), NULL, 0);