delphi - 目标多字节代码页中不存在 Unicode 字符的映射:如何将 MemoryStream 转换为 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;
我的函数在大多数转换中都可以正常工作,但不是这样。我检查了这些链接:link1,link2但它们与我的情况不同。我也尝试了link3,但仍然失败。
知道如何解决问题吗?
解决方案
您无需手动解码原始数据。让TIdHTTP
我们为你做吧。该Post()
方法有一个返回解码字符串的重载:
Result := idHttp.Post(url, slTemp);
此外,您需要完全摆脱这条线:
idHttp.Request.AcceptEncoding := 'gzip, deflate, br';
否则,如果服务器决定发送压缩TIdHTTP
响应,将无法正确解码响应。您手动授予服务器执行此操作的权限,但您没有设置属性以便处理解压缩。除非您愿意并且能够手动检测和解码实际以您指定的格式之一编码的响应,否则请勿手动设置。否则,只需根据其实际功能在内部管理该属性。TIdHTTP.Compressor
TIdHTTP
AcceptEncoding
TIdHTTP
AcceptEncoding
推荐阅读
- mysql - 如何在 POST 正文的基础上创建动态插入语句
- react-native - 如何在 React Native Elements 库的 Overlay 组件的子组件上启用 onPress?
- spring - Activiti TimerBoundaryEvent 立即超时
- java - 在 Java 中比较不同格式的 2 个日期?
- javascript - 当我遍历整个项目数组时,如何仅显示一次标题?
- angular - 如何让 ngx-mask npm 包用于在 Angular 中屏蔽电话号码?
- stackdriver - 来自有效负载(Stackdrive)的 GCP 日志记录有效负载
- swift - VoiceOver 不会宣布 NSAccessibility 通知
- jupyter-notebook - Jupyter Notebook - 未使用 Numba 和 Dask 定义的全局名称
- azure-active-directory - 为什么 MSAL 返回的 JWT 令牌的 amr 字段有时会有 wia 或 mfa?