论坛首页 综合技术版 C

交流DELPHI+idhttp(10.0版本)控件取网页源文件乱码解决方法

浏览 901 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-03-21 关键字: delphi idhttp
  我用IDHTTP取目标网页源文件,但对于网页是EUC-JP编码,取出源文件放到memo中显示时是乱码。我再用WebBrowser先显示目标网页,取出源文件显示在memo中正常。
  个别朋友可能会说,是因为Memo控件不支持EUC-JP编码的问题导致,开始我也是这样认为,但应该有方法可以在IDHTTP读到源文件后作转换,WebBrowser控件既然可以做到这一点,我想用IDHTTP同样应该是可以的。
  我试着设置以下属性,但依然未能解决问题:
  IdHTTP.Request.AcceptLanguage := 'ja';
  IdHTTP.Request.AcceptEncoding := 'Shift_JIS';

  用WebBrowser和IDHTTP两种控件取网页的源文件,对于euc-jp编码的网页为什么用WebBrowser取出的源码可以正常显示,而用IDHTTP取出的源码是乱码,请有经验的DX发表高见。
  我现在要用IDHTTP取网页源文件,因为它的好处在可以不用显示网页,速度快,而用WebBrowser要先显示完网页才能读到源文件,效果不如前。
   
时间:2008-03-21
WebBrowser取出来的好像是unicode的。
IDHTTP你得自己进行编码转换。
   
0 请登录后投票
时间:2008-03-23
补充:我用IE找开目标网页,查看源文件,显示也是简体乱码,但用firefox找开目标网页,查看源文件显示正常。我想firefox浏览器既然可以做到,那总是应该有方法的,请交流指导!
   
0 请登录后投票
时间:2008-03-23
继续补充:
A、用IDHTTP取出来源文件显示如下:
<title>惗拞宲丂傆傞偝偲堦斣両</title>
B、用WebBrowser取出来源文件显示如下:
<TITLE>生中継 ふるさと一番!</TITLE>

WebBrowser取出来的是我想要的,问题就是通过IDHTTP怎样才能得到WebBrowser这样的效果?
   
0 请登录后投票
时间:2008-03-24
到今天有了新的进展,但也碰到了新的问题。对于日文(Shift-JIS)编码可以正常通过IDHTTP取到正确的源文件,但对于日文EUC編碼去却以下程式不能得到正确结果,不解。贴出我的代码,可以供需要取Shift-JIS编码的朋友参考。
var
IframeUrl: string;
ret:WideString;//TStringStream;
SourceHtmlCode: WideString;
begin
IframeUrl := 'http://ctplp.blog15.fc2.com/blog-entry-33.html';//这个网站是EUC-JS编码
//IframeUrl := 'http://www.nhk.or.jp/furusato/koremade/koremade_ibaraki.html';//这个网站是SHIFT-JS编码

IdHTTP.HandleRedirects:=true;
IdHTTP.Request.ContentType:= 'application/x-www-form-urlencoded';
IdHTTP.Request.UserAgent:= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)';
IdHTTP.Request.SetHeaders;
try
SourceHtmlCode := StringToWideString(IdHTTP.Get(IframeUrl),51932);//日文EUC編碼是51932 日文(Shift-JIS)是932
Memo1.Lines.Text := SourceHtmlCode;
except
ShowMessage('未找到HTTP服务器');
end;
end;

function StringToWideString(const S: string; CodePage: Word): WideString;
var
InputLength, OutputLength: Integer;
begin
InputLength := Length(S);
OutputLength := MultiByteToWideChar(CodePage, 0, PChar(S), InputLength, nil, 0);
SetLength(Result, OutputLength);
MultiByteToWideChar(CodePage, 0, PChar(S), InputLength, PWideChar(Result), OutputLength);
end;
   
0 请登录后投票
论坛首页 综合技术版 C

跳转论坛:
JavaEye推荐