delphi xe6目标多字节代码页中不存在Unicode字符的映射

时间:2014-09-26 13:31:20

标签: android ios delphi unicode indy

以下代码适用于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;

1 个答案:

答案 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;