以下代码适用于Win32,无论如何,如果在Android或iOS上运行,它都是异常的。例外情况是:“目标多字节代码页中不存在Unicode字符的映射”
function GetURLAsString(aURL: string): string;
var
lHTTP: TIdHTTP;
lStream: TStringstream;
begin
lHTTP := TIdHTTP.Create(nil);
lStream := TStringstream.Create(result);//create('',EEncoding.utf8),not work
try
lHTTP.Get(aURL, lStream);
lStream.Position := 0;
result := lStream.readstring(lStream.Size);//error here
finally
FreeAndNil(lHTTP);
FreeAndNil(lStream);
end;
end;
答案 0 :(得分:4)
TStringStream
不适合这种情况。它要求您在其构造函数中指定编码。如果不这样做,则使用操作系统默认编码。在Windows上,该默认值是特定于语言环境的运行应用程序的用户帐户。在移动设备上,默认为UTF-8。
HTTP可以使用任意数量的字符集传输文本。如果数据与TStringStream
使用的编码不匹配,您将遇到解码问题。
TIdHTTP
知道收到的数据的字符集,并可以为您解码为Delphi string
,例如:
function GetURLAsString(aURL: string): string;
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
Result := lHTTP.Get(aURL);
finally
FreeAndNil(lHTTP);
end;
end;