德尔福。 Indy&西里尔字母

时间:2013-07-06 05:51:12

标签: 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;

当我指定一个像президент.рф这样的网址时,我正在完美地使用英文网址地址,这是一个网址转换为?????????.??的isy Indy - (HTTP Analyzer的屏幕截图)

enter image description here

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

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

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

enter image description here

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

谢谢。

1 个答案:

答案 0 :(得分:7)

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

Result.values['responce'] := idHttp.Get(TIdURI.URLEncode(url));

GetWebPage('http://президент.рф');

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

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