以下代码可在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;
最佳答案
TStringStream
不适合这种情况。它要求您在其构造函数中指定编码。如果不这样做,它将改用OS默认编码。在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;