TIdHttp.Get回来的网页为什么是乱码?(50分)

  • 主题发起人 主题发起人 WilliamGui
  • 开始时间 开始时间
W

WilliamGui

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如何:
IDP:=TIdHttp.Create(nil);
IDP.Request.UserAgent:='MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727';
IDP.Request.CacheControl:='no-cache';
IDP.HandleRedirects:=true;
sHtml:=IDP.Get('http://www.sina.com/');
为什么中文字是乱码,html标识还是正常的。
sina为gb2312,如果网页是utf-8的中文字就显示正常,如何处理?
我想下载任何国家的网页,就像菜单的"自动选择",如何做到?
我试过Request.AcceptCharSet AcceptEncoding AcceptLanguage 都不行
 
获取数据后使用AnsiToUTF8或者UTF8ToAnsi函数就可以转换了。
 
你用Delphi2009会显得容易些..
只是检测到是GB2312的时候..要转成Ansi的....

或者你检查不是GB2312的时候..就转成utf-8的就好了..
现阶段就这样....我也本以为delphi2009能解决所有的..没想到解决了unicode,反而不能解决ansi的了
 
我用了 UTF8TOAnsi 或AnsiToUtf8 都没用(只有中文是乱码)
但是,将
s:=IDHttp1.Get(WebPageUrl);
改为:
IDHttp1.Get(WebPageUrl, tmpStream);
tmpStream.SaveToFile('e:/1.txt');
打开,1.txt是正确的
查看代码,s:=IDHttp1.Get(WebPageUrl);的重载多了:
function TIdCustomHTTP.Get(AURL: string; AIgnoreReplies: array of SmallInt): string;
var
LStream: TMemoryStream;
begin
LStream := TMemoryStream.Create;
try
Get(AURL, LStream, AIgnoreReplies);
LStream.Position := 0;
// This is here instead of a TStringStream for .net conversions?
Result := ReadStringFromStream(LStream, -1,
ContentTypeStrToEncoding(Response.FContentType));
finally
FreeAndNil(LStream);
end;
end;
多了些东西,现在我想自己将 TMemoryStream 保存为 String,
但如何实现tmpStream.SaveToFile('e:/1.txt');的功能,将它保存到String里
看源代码太麻烦了,有人回个声不?
 
procedure TForm1.Button1Click(Sender: TObject);
var
MyStream:TMemoryStream;
sList:TStringList;
url,ym:String;
begin
MyStream:=TMemoryStream.Create;
sList:=TStringList.Create;

url:='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

try
IdHTtP1.Get(url,MyStream);
except//INDY控件一般要使用这种try..except结构.
Showmessage('网络出错!');
MyStream.Free;
sList.Free;
Exit;
end;
MyStream.Position:=0;
slist.loadfromstream(MyStream);
ym:=sList.Text;
MyStream.Free;
sList.Free;
end;


ym就是网页源代码。可以正常显示中文。
 
已经可以了。
IdHTtP1.Get(url,MyStream);
替代
s:=IdHTtP1.Get(url);
这样,不经过VCL的加工,是什么就是什么,不会乱码

用TStringStream替代TMemoryStream,这样可以直接ToString,
比TList安全,可靠。

但现在又有一个新问题,发现即使只用一个线程或不用线程,长时间运行后,
不能Get回来,怎么回事?
 
那就考虑超时设置及重试机制。
 
后退
顶部