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)
但它不起作用 - 当我尝试调用我的函数时,我得到错误:

那么,我如何强制其功能与西里尔语地址一起工作?
谢谢.
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中实施).
| 归档时间: |
|
| 查看次数: |
1314 次 |
| 最近记录: |