idhttp的三个问题,熟悉此控件的人请进
编程的环境为BCB 2010
void __fastcall TForm1::Button1Click(TObject *Sender)
{
idhttp->AllowCookies = true;
idhttp->Request->Connection="Keep-Alive";
idhttp->HandleRedirects=true;
TStringStream *ms = new TStringStream();
//AnsiString strUrl = "http://lybase.net";
AnsiString strUrl = "http://www.linuxsir.org/bbs";
idhttp->Get(strUrl, ms);
HtmlData=ms->DataString;
lowerHtmlData=ms->DataString.LowerCase();//POS函数区分大小写,所以需要转为小写
ms->Position=0;
Memo1->Lines->LoadFromStream(ms);
delete ms;
//开始分析html
}
为啥我在访问linuxsir和csdn的时候是乱码的?怎么才能让idhttp自适应,utf8和GB2312的编码?在执行POST操作的时候,如何才能让IDHTTP按我要求的编码发送数据(gb2312或utf8)?
顺便拜个年,大家过年好~~
[解决办法]
idhttp和编码有毛关系???这个只是个http协议。
AnsiString strUrl = "http://www.linuxsir.org/bbs";
idhttp->Get(strUrl, ms);
linuxsir不知道,csdn的是utf8,
idhttp->Get(strUrl, ms);2010的应该是UnicodeString,你前面用的是AnsiString,用UnicodeString试试。
我记得idhttp->Get()还有个TStream *参数的(可以用TMemoryStream),直接下载数据,那就和字符编码无关了。
[解决办法]
看网页源代码你可以看到<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
这段代码根据charset自己转换,你转换后显示的就不是乱码了。
[解决办法]
UTF8编码的数据流要这样
ms=new TStringStream("",TEnocoding::UTF8.....
如果是GB2312的要 new TStringStream("",TEnocoding::Default.....
后面忘了。没在家电脑查不了。
同时如果你这样设置:dhttp->HandleRedirects=true;必须指定一个onredirect函数。否则有可能会出错。
[解决办法]
POST的数据用AnsiToUTF8转换一下。
[解决办法]
//GB2312到UTF-8的转换char* G2U(const char* gb2312){int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);wchar_t* wstr = new wchar_t[len+1];memset(wstr, 0, len+1);MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);char* str = new char[len+1];memset(str, 0, len+1);WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);if(wstr) delete[] wstr;return str;}
[解决办法]
String url;url = "http://xxx"; TStringStream *ss1=new TStringStream("",TEncoding::UTF8,true);try{http1->Get(url, ss1);}catch(...){}ss1->Position = 0;String txt = ss1->DataString; mmo1->Lines->Text =Utf8ToAnsi(UTF8String(txt) );delete ss1;