论坛首页 编程语言技术论坛

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

浏览 8346 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-21  
C
  我用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 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics