首页 > 解决方案 > 目标多字节代码页中不存在 Unicode 字符的映射:如何将 MemoryStream 转换为 String

问题描述

我的目标是能够转换TMemoryStreamstring. 我有这段代码可以将数据放入TMemoryStream

var
  idHttp : TIdHTTPEx;
  url : string;
  slTemp : TStringList;
  memoryStream : TMemoryStream;
begin
  try

    idHttp := TIdHTTPEx.Create(nil);
    slTemp := TStringList.Create;
    memoryStream := TMemoryStream.Create;
    try
      url := GetURL;
      SetParams(slTemp);

  idHttp.Request.Accept := 'application/json, text/javascript, */*; q=0.01';
  idHttp.Request.AcceptEncoding := 'gzip, deflate, br';
  idHttp.Request.AcceptLanguage := 'en-US,en;q=0.9';
  idHttp.Request.CacheControl := 'no-cache';
  idHttp.Request.Connection := 'keep-alive';
  idHttp.Request.ContentLength := 16;
  idHttp.Request.ContentType := 'application/x-www-form-urlencoded; charset=UTF-8';

      idHttp.Post(url, slTemp, memoryStream);
      Result := MemoryStreamToString(memoryStream);
    finally
      memoryStream.Free;
      slTemp.Free;
      idHttp.Free;
    end;

  except on E : Exception do
    begin
      Result := 'e:' + E.Message;
    end;
  end;
end;

这是我将其转换为的代码string

function MemoryStreamToString(MemoryStream : TMemoryStream): string;
var
  StringStream: TStringStream;
begin
  Result:='';

    StringStream:= TStringStream.Create('', TEncoding.UTF8);
  try
    MemoryStream.Position := 0;
    StringStream.CopyFrom(MemoryStream, MemoryStream.Size);

    Result:= StringStream.DataString;
    Result := Result;
  finally
    FreeAndNil(StringStream);
  end;

end;

我的函数在大多数转换中都可以正常工作,但不是这样。我检查了这些链接:link1link2但它们与我的情况不同。我也尝试了link3,但仍然失败。

知道如何解决问题吗?

标签: delphiindydelphi-xe7indy10idhttp

解决方案


您无需手动解码原始数据。让TIdHTTP我们为你做吧。该Post()方法有一个返回解码字符串的重载:

Result := idHttp.Post(url, slTemp);

此外,您需要完全摆脱这条线:

idHttp.Request.AcceptEncoding := 'gzip, deflate, br';

否则,如果服务器决定发送压缩TIdHTTP响应,将无法正确解码响应。您手动授予服务器执行此操作的权限,但您没有设置属性以便处理解压缩。除非您愿意并且能够手动检测和解码实际以您指定的格式之一编码的响应,否则请勿手动设置。否则,只需根据其实际功能在内部管理该属性。TIdHTTP.CompressorTIdHTTPAcceptEncodingTIdHTTPAcceptEncoding


推荐阅读