德尔福.Indy和西里尔字母

Rom*_*kin 2 delphi indy delphi-xe3 cyrillic

我一直在写一些通过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;
Run Code Online (Sandbox Code Playgroud)

我正在使用英文网址地址完美地工作,当我指定一个URL,如?????????.??URL转换为的iside Indy ?????????.??- (HTTP Analyzer的屏幕截图)

在此输入图像描述

我找到了解决我问题的方法:

idHttp.IOHandler.DefStringEncoding := TEncoding.Ansi; 
// also tried - TEncoding.Unicode, TEncoding.UTF8
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

那么,我如何强制其功能与西里尔语地址一起工作?

谢谢.

Rem*_*eau 7

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

Result.values['responce'] := idHttp.Get(TIdURI.URLEncode(url));
Run Code Online (Sandbox Code Playgroud)

GetWebPage('http://?????????.??');
Run Code Online (Sandbox Code Playgroud)

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

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