【问题标题】:error with ISO-88559-1 encoding using TIdHttp and Delphi使用 TIdHttp 和 Delphi 的 ISO-88559-1 编码错误
【发布时间】:2025-11-29 06:15:01
【问题描述】:

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

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

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

我已经尝试过在 * 中发布的几种表单,但都没有成功。

我的功能如下:

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 的更新版本

【问题讨论】:

  • 仅供参考,Indy 的当前版本是 10.6.2.5438

标签: delphi-7 indy10 idhttp


【解决方案1】:

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

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

在 Unicode 版本的 Delphi 中,StringUnicodeString 的别名,此 Unicode 数据按原样返回。

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

输出的 ANSI 字符集不需要与原始数据使用的字符集相同。 ADestEncoding 的意义在于指定您希望输出所在的字符集。

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

或者,要使用运行代码的机器的操作系统默认字符集,请将ADestEncoding 设置为IndyTextEncoding_OSDefault(或将GIdDefaultTextEncoding 设置为encOSDefault)。

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

【讨论】:

  • 感谢您的解释和宝贵的时间。这正是问题所在。
最近更新 更多