在 Delphi 7 中将 TMemoryStream 转换为 WideString

Convert TMemoryStream to WideString in Delphi 7

当我在 Delphi 7 中使用此代码和函数时,将显示一条错误消息:

此代码将 MemoryStream 内容转换为 WideString

function ReadWideString(stream: TStream): WideString;
var
  nChars: LongInt;
begin
  stream.Position := 0;
  stream.ReadBuffer(nChars, SizeOf(nChars));
  SetLength(Result, nChars);
  if nChars > 0 then
    stream.ReadBuffer(Result[1], nChars * SizeOf(Result[1]));
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  mem: TMemoryStream;
begin
  mem := TMemoryStream.Create;
  mem.LoadFromFile('C:\Users\User1\Desktop\wide.txt');
  Memo1.Lines.Add(ReadWideString(mem));
end;

如有任何帮助,我们将不胜感激。

您的代码可以正常工作。问题是您传递给函数的输入不是预期的格式。

您正在使用的函数需要一个包含长度的 4 字节整数,后跟 UTF-16 负载。

看起来您实际上有直接的 UTF-16 文本,没有前缀长度。像这样阅读:

stream.Position := 0;
nChars := stream.Size div SizeOf(Result[1]);
SetLength(Result, nChars);
if nChars > 0 then
  stream.ReadBuffer(Result[1], nChars * SizeOf(Result[1]));

现在,您的输入可能包含 UTF-16 BOM。如果是这样,您需要决定如何处理它。

这里的底线是您的代码需要与您提供的输入相匹配。