在 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。如果是这样,您需要决定如何处理它。
这里的底线是您的代码需要与您提供的输入相匹配。
当我在 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。如果是这样,您需要决定如何处理它。
这里的底线是您的代码需要与您提供的输入相匹配。