idhttp的三个问题,熟悉此控件的人请进

meikeer 2011-02-05 08:14:52
编程的环境为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)?
顺便拜个年,大家过年好~~
...全文
192 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ThinkHand 2011-02-09
  • 打赏
  • 举报
回复

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;
laowang2 2011-02-09
  • 打赏
  • 举报
回复
//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;
}
laowang2 2011-02-09
  • 打赏
  • 举报
回复
POST的数据用AnsiToUTF8转换一下。
meikeer 2011-02-09
  • 打赏
  • 举报
回复
谢谢楼上几位的回复,可是我在POST数据的时候始终是以utf8编码发送的,有什么办法让它以GB2312编码发送吗?
meikeer 2011-02-07
  • 打赏
  • 举报
回复
是我搞错了Memo1->Lines->CommaText,这样取值时空格会被转成回车。。
第二个问题先不考虑了,因为一个站基本上都会采用同一种编码

麻烦高人再帮我解释一下第三个问题?
meikeer 2011-02-07
  • 打赏
  • 举报
回复
TStringStream *ms = new TStringStream("",TEncoding::UTF8,true);
这样的话,第一个问题倒是解决了,可是为啥memo1里,html语法中的空格为啥都变成了回车符??
Bosman 2011-02-05
  • 打赏
  • 举报
回复
UTF8编码的数据流要这样
ms=new TStringStream("",TEnocoding::UTF8.....
如果是GB2312的要 new TStringStream("",TEnocoding::Default.....
后面忘了。没在家电脑查不了。
同时如果你这样设置:dhttp->HandleRedirects=true;必须指定一个onredirect函数。否则有可能会出错。
hemiya 2011-02-05
  • 打赏
  • 举报
回复
看网页源代码你可以看到<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
这段代码根据charset自己转换,你转换后显示的就不是乱码了。
hemiya 2011-02-05
  • 打赏
  • 举报
回复
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),直接下载数据,那就和字符编码无关了。

1,315

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧