使用 TIdHttp 和 Delphi 的 ISO-88559-1 编码错误
error with ISO-88559-1 encoding using TIdHttp and Delphi
我对从 TIdHTTP
的 Post()
方法获得的结果中的重音有一个很大的问题。
我正在访问的 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 版本中,String
是 UnicodeString
的别名,返回此 Unicode 数据 as-is.
在 Delphi 的 ANSI 版本中,其中 String
是 AnsiString
的别名,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
)。
我对从 TIdHTTP
的 Post()
方法获得的结果中的重音有一个很大的问题。
我正在访问的 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 版本中,String
是 UnicodeString
的别名,返回此 Unicode 数据 as-is.
在 Delphi 的 ANSI 版本中,其中 String
是 AnsiString
的别名,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
)。