返回数据是网页的源码,是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; }}
思路就是把返回的数据转成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; }}
怎么转换?怎么把字符串转换成url编码?
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;
}
这个是干什么的? 没看懂。