目标多字节代码页中不存在 Unicode 字符的映射:如何将 MemoryStream 转换为 String
No mapping for the Unicode character exists in the target multi-byte code page : how to convert MemoryStream to String
我的目标是能够将 TMemoryStream
转换为 string
。我有这段代码可以将数据输入 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;
我的函数在大多数转换中都运行良好,但在这个转换中却不行。我也检查了这些链接:, link2 but they are different than my situation. I tried link3 但仍然失败。
知道如何解决这个问题吗?
您不需要手动解码原始数据。让 TIdHTTP
为您完成。 Post()
方法有一个重载,即 returns 解码后的字符串:
Result := idHttp.Post(url, slTemp);
另外,你需要完全去掉这一行:
idHttp.Request.AcceptEncoding := 'gzip, deflate, br';
否则,如果服务器决定发送压缩响应,TIdHTTP
将无法正确解码响应。您手动授予服务器这样做的权限,但您没有设置 TIdHTTP.Compressor
属性 因此 TIdHTTP
可以处理解压缩。不要手动设置 AcceptEncoding
除非您愿意并且能够手动检测和解码实际上已经以您指定的格式之一编码的响应。否则,就让TIdHTTP
根据其实际能力在内部管理AcceptEncoding
属性。
我的目标是能够将 TMemoryStream
转换为 string
。我有这段代码可以将数据输入 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;
我的函数在大多数转换中都运行良好,但在这个转换中却不行。我也检查了这些链接:
知道如何解决这个问题吗?
您不需要手动解码原始数据。让 TIdHTTP
为您完成。 Post()
方法有一个重载,即 returns 解码后的字符串:
Result := idHttp.Post(url, slTemp);
另外,你需要完全去掉这一行:
idHttp.Request.AcceptEncoding := 'gzip, deflate, br';
否则,如果服务器决定发送压缩响应,TIdHTTP
将无法正确解码响应。您手动授予服务器这样做的权限,但您没有设置 TIdHTTP.Compressor
属性 因此 TIdHTTP
可以处理解压缩。不要手动设置 AcceptEncoding
除非您愿意并且能够手动检测和解码实际上已经以您指定的格式之一编码的响应。否则,就让TIdHTTP
根据其实际能力在内部管理AcceptEncoding
属性。