我一直在编写一些按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的屏幕截图)
我找到了解决问题的方法:
idHttp.IOHandler.DefStringEncoding := TEncoding.Ansi;
// also tried - TEncoding.Unicode, TEncoding.UTF8
但它不起作用 - 当我尝试调用我的函数时,我收到错误:
那么,我如何强制其功能与西里尔语地址一起使用?
谢谢。
答案 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中实施)。