2

我一直在编写一些通过 URL 下载指定网页源代码的函数:

function GetWebPage(const url: string): tStringList;
var
  idHttp: TidHttp;
begin
  Result := tStringList.Create;
  idHttp := TidHttp.Create(nil);

  // set params
  idHttp.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)';
  idHttp.Request.AcceptLanguage := 'ru en';
  idHttp.Response.KeepAlive := True;
  idHttp.HandleRedirects := True;
  idHttp.ConnectTimeout := 5000;
  idHttp.ReadTimeout := 5000;

  try
    try
      Result.values['responce'] := idHttp.Get(url);
    except
      Result.values['responce'] := '';
    end;

  finally
    Result.values['code'] := IntToStr(idHttp.ResponseCode);
    FreeAndNil(idHttp);
  end;

当我指定一个 URL 时,我可以完美地使用英文 URL 地址,在президент.рфIndy 旁边,该 URL 转换为?????????.??- (HTTP Analyzer 的屏幕截图)

在此处输入图像描述

我为我的问题找到了这个解决方案:

idHttp.IOHandler.DefStringEncoding := TEncoding.Ansi; 
// also tried - TEncoding.Unicode, TEncoding.UTF8

但它不起作用 - 当我尝试调用我的函数时,出现错误:

在此处输入图像描述

那么,我如何强制它的功能与西里尔地址一起使用?

谢谢你。

4

1 回答 1

7

URL 中只能包含 ASCII 字符。您需要预先格式化 URL 以对非 ASCII 字符进行编码,然后再将其传递给TIdHTTP. 您可以TIdURI.URLEncode()为此目的使用该方法,例如:

Result.values['responce'] := idHttp.Get(TIdURI.URLEncode(url));
GetWebPage('http://президент.рф');

UTF-8 通常用于 URL 编码,因此它是 使用的默认编码TIdURL,但并非所有服务器都使用 UTF-8,因此如果您需要使用不同的编码,则可以为此目的TIdURI.URLEncode()使用可选参数。AByteEncoding

话虽如此,使用IRI而不是 URL 可以更好地为国际资源提供服务,但 Indy 本身并不支持 IRI(这将在 Indy 11 中实现)。

于 2013-07-06T06:11:23.497 回答