开了两贴了还没解决,继续提,关于保存网页乱码~(100分)

  • 主题发起人 主题发起人 ljdzxx
  • 开始时间 开始时间
L

ljdzxx

Unregistered / Unconfirmed
GUEST, unregistred user!
问题就是
http://www.ublove.com/cng/search/Profile.asp?userid=sexygirl486
这个网页,用IE打开后,将网页另存为,然后再用记事本打开该网页,可以正确的显示网页源码,现在换用idhttp(我装的Indy 10)下载,代码如下:
var
Stream_Rec: TMemoryStream;
begin
Stream_Rec:=TMemoryStream.Create;
idHttp1.Get('http://www.ublove.com/cng/search/Profile.asp?userid=sexygirl486',Stream_Rec);
Stream_Rec.SaveToFile('d:/a.htm');
end;
同样用记事本打开,显示的全是乱码。
我的问题就是,如何用IdHttp实现像IE的另存为一样的功能,不要搞出这么多的乱码。
Indy 10 中的IdHttp有Request.AcceptCharSet,Request.AcceptEncoding,Request.AcceptLanguage等属性可以设置的,我在Google上找了一些外文资料看过,试着设置过几次都没能成功,是否是这方面问题?对于utf-8编码的网页该如何设置?有人懂这方面的吗?

我前面开了两贴都没能够很好的解决这个问题,不解决不甘心
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3478485
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3476205
 
Indy 10的下载地址:
http://www.atozed.com/indy/plus/Files.en.aspx
注意装前先卸掉旧的版本,大家快来帮我测试一下
 
如果你使用xp sp2的,建议你安装乱码补丁
 
我没用过10,帮你顶.
记得朋友说过,INDY的某个PAS文件里,有个什么removenotvalidchar,将该函数内容注释掉就可以了.你可以试着在INDY文件夹里搜搜validchar这个关键字.
 
嗯。和indy没有任何关系。
用UE打开那个文件。韩文还是乱码。
应该是系统的问题的。
除了IE可以打开。
你可以到区域语言那里设置为韩国语看看。
我这系统里找不到韩国语。不懂朝鲜语是不是一样的。

如同我的一位朋友。他的英文版系统显示不了中文的菜单。但是在IE里可是显示中文一样。
http://www.blogchinese.com/user1/44961/archives/2005/112683.shtml
当时是用这个方法解决的。
 
To 394558739:我装了乱码补丁包还是不行,removenotvalidchar函数没找到,只在IdMessageCoderMIME单元找到个RemoveInvalidCharsFromFilename,如下
function TIdMessageDecoderMIME.RemoveInvalidCharsFromFilename(const AFilename: string): string;
var
LN: integer;
begin
Result := AFilename;
//First, strip any Windows or Unix path...
for LN := Length(Result) downto 1 do begin
if ((Result[LN] = '/') or (Result[LN] = '/')) then begin {do not localize}
Result := Copy(Result, LN+1, MAXINT);
break;
end;
end;
//Now remove any invalid filename chars.
//Hmm - this code will be less buggy if I just replace them with _
for LN := 1 to Length(Result) do begin
if Pos(Result[LN], ValidWindowsFilenameChars) = 0 then begin
Result[LN] := '_'; {do not localize}
end;
end;
end;
但我想应该不是这个的缘故,这个只是处理文件名
 
To amp34:你说的用IE打开那网页韩文还是乱码的问题刷一下就可以显示正常的,我也不知道是怎么回事,但另存下来后,我在Delphi中用Unicode控件装载它是可以正常显示韩文的,现在关键问题是,如何实现像IE一样的"另存为"功能,我用IdHttp抓下来的总是乱码,用Unicode 控件装载它也是乱码,而IE另存的却是完好的格式.

另:用你朋友BLOG中的方式设置韩文也无效.
 
那个不是我朋友的BLOG。那个只是网上找到的资料。
嗯。我说的是UE。不是IE。UE是一个十六进制的文本编辑工具。
IE打开是正常的。
你说的用UNICODE装载正常。嗯。那就应该和系统无关了。
另外。刚刚另存了HTML。和直接用IDHTTP抓下来的。看起来是大小是一样的。
呃。可能是因为我用的不是indy10吧。
我直接用的是Delphi7自带的版本。
嗯。我也刚开始学Delphi不久。是个新手。所以。只是随便给点意见的。呵呵。
 
To:amp34 看起来是大小是一样的?大小一样不能说明问题啊,内容呢?一个是正常的utf-8码内容,一个是乱码对不对啊?
 
至少我用UE打开。内容是一模一样的。只是不都不能正常显示。
UE会自动把UTF8转成UNICODE的。
 
Indy 10我是无用过,至于保存网页用TWebBrowser吧,
你说查不了removenotvalidchar,就换多个方法查,如remov或valid或....,查时要将文件夹内的文件设成不隐藏。
 
直接用IdHttp.Get('url', 'c:/本地文件名.htm');
这样呢?
 
哎..............................高手在哪里啊???
 
简单的用Indy 10保存网页是乱码的,必须进行编码转换,如使用D7上编码转换控件,或自己编写转换代码.
 
试试 用unicode的控件
tntstringlist.loadfromstream(Stream_Rec)
或者用 TTntMemoryStream试试
 
var
Stream_Rec: TMemoryStream;
begin
Stream_Rec:=TMemoryStream.Create;
idHttp1.Get('http://www.ublove.com/cng/search/Profile.asp?userid=sexygirl486',Stream_Rec);
Stream_Rec.Position:=0;
TntMemo1.lines.LoadFromStream(Stream_Rec)
end;
这样获取还是乱码!!!

TTntMemoryStream没有这种类型!D7上编码转换控件怎么用能详细说一下么?我现在只有不到500分了,解决了全部给你,我用的D6
 
TTntMemoryStream有阿,在TntClasses.pas文件中。
当然,你的问题可能是编码的问题,可能需要转换
 
问题我已经帮你解决,一是要请求UTF-8编码;二是得到的内容前面加上#$EF#$BB#$BF,
这是utf-8的标记,没有记事本就不认了
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
f:textfile ;
begin
idhttp1.Response.ContentEncoding:='UTF-8';
s:=idhttp1.Get('http://www.ublove.com/cng/search/Profile.asp?userid=sexygirl486');
s:=#$EF#$BB#$BF+ s;
assignfile(f,'c:/id.htm');
rewrite(f);
writeln(f,s);
closefile(f);
end;
 
再补充,其实idhttp1.Response.ContentEncoding:='UTF-8';这句话是多余的,
不管用的是什么编码,下载后的内容都一样的。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
937
SUNSTONE的Delphi笔记
S
后退
顶部