【问题标题】:Delphi. Indy & cyrillic letters德尔福。印地语和西里尔字母
【发布时间】:2013-07-06 05:51:12
【问题描述】:

我一直在写一些通过 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 分析器的屏幕截图)

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

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

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

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

谢谢。

【问题讨论】:

  • 哇,真正的历史用户代理...但是无论如何,您使用的是哪个版本的 Delphi?你能在你的问题中添加正确的标签吗?
  • 我正在使用 Delphi XE3 :)
  • 访问冲突意味着您正在访问无效的内存。您正在调试器中运行,所以让它准确地告诉您哪些代码失败了。

标签: delphi indy delphi-xe3 cyrillic


【解决方案1】:

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

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

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

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

【讨论】:

  • 以什么方式?你需要更具体。 HTTP Analyzer 中的输出是否发生了变化?如果不是,那么 URL 的主机名可能需要改为 IDN 编码。 Indy 在 IdIDN.pas 单元中有一个IDNToPunnyCode() 函数。另外,我建议您通过实际的网络浏览器运行原始 URL,并根据 HTTP 分析器查看它是如何编码的,然后在 Indy 中复制它。
  • 是的,问题出在域中,需要转换。功能IDNToPunnyCode() 不起作用,但我找到了另一个功能。所以,TIdURI.URLEncode() 只需要对 url 路径和参数进行编码。无论如何-感谢您的建议。 :)
  • IDNToPunnyCode() 以什么方式不起作用?您将域转换为有效的域是什么?
  • 这意味着要么你没有在 Windows 上使用 Indy(Indy 目前只在 Windows 上实现 IDN),要么你的 Windows 版本不支持 IdnToAscii() 函数。
  • 在我的 Win7 x64 系统上,IDNToPunnyCode('президент.рф') 不返回空字符串。它返回xn--d1abbgf6aiiy.xn--p1ai
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多