以下代码可在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;

10-08 04:48