使用 TIdHttp 和 Delphi 的 ISO-88559-1 编码错误

error with ISO-88559-1 encoding using TIdHttp and Delphi

我对从 TIdHTTPPost() 方法获得的结果中的重音有一个很大的问题。

我正在访问的 URL 已经正确编码,我将结果保存到服务器上的文本文件中以确保它全部正确。但是当我通过我创建的函数将数据带到 Delphi 时,而不是带重音的字母,字符“?”正在出现。

例如,如果页面结果为Conexão não configurada,则函数的结果为Conex?o n?o configurada

我尝试了在 Whosebug 中发布的几种表格,但没有成功。

我的函数如下:

function HttpPost(PostUrl: string; PostParams: TStringList): string;
var
  IdHTTP1: TIdHTTP;
  IOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  IdHTTP1 := TIdHTTP.Create(nil);
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  IdHTTP1.IOHandler := IOHandler;
  IdHTTP1.HandleRedirects := True;
  IdHTTP1.Request.ContentType := 'text/html';
  IdHTTP1.Request.CharSet := 'ISO-8859-1';
  IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
  IdHTTP1.ReadTimeout := 20000;
  try
    Result := IdHTTP1.Post(PostUrl, PostParams);
  except
    on E:Exception do
    begin
      Result := 'ErrorExcept';
      Msg(E,2);
    end;
  end;
  IdHTTP1.Free;
  IOHandler.Free;
end;

Indy 的更新版本为 10.6.2.0

您使用的是 Delphi 的 ANSI 版本(Delphi 在 2009 年切换到 Unicode)。

returns String 使用 Content-Type 响应 header 中报告的字符集将原始服务器数据解码为 Unicode 的 TIdHTTP.Post() 版本,如果未指定字符集,则为默认值。因此,请确保发送的数据实际上以正确的字符集编码,并且该字符集被正确报告。

在 Delphi 的 Unicode 版本中,StringUnicodeString 的别名,返回此 Unicode 数据 as-is.

在 Delphi 的 ANSI 版本中,其中 StringAnsiString 的别名,Post() 将此 Unicode 数据转换为 ANSI 以供输出。您看到的 ? 字符表示 Unicode 数据包含要转换为的 ANSI 字符集中不存在的字符。 Post() 有一个可选的 ADestEncoding 参数来指定输出所需的 ANSI 字符集。如果未指定,则使用 Indy 的默认编码。该默认值由 IdGlobal 单元中的全局 GIdDefaultTextEncoding 变量控制,默认设置为 encASCII(7 位 US-ASCII)。

输出的ANSI字符集不需要与原始数据使用的字符集相同。 ADestEncoding 的要点是指定您 想要 输出的字符集。

如果您提前知道要使用的确切 ANSI 字符集,则可以将 ADestEncoding 设置为该字符集的 IIdTextEncoding,例如从中的 CharsetToEncoding() 函数IdGlobalProtocols 单元,或 IdGlobal 单元中的 IndyTextEncoding() 函数。

或者,要使用您的代码 运行 所在机器的 OS 默认字符集,请将 ADestEncoding 设置为 IndyTextEncoding_OSDefault(或设置 GIdDefaultTextEncoding encOSDefault).

但请注意,Unicode-to-ANSI 转换通常是有损的,因此最好使用无损的 UTF-8 代替。您可以将 ADestEncoding 设置为 IndyTextEncoding_UTF8(或将 GIdDefaultTextEncoding 设置为 encUTF8)。