替换包含#0的字符串?

Ina*_*Ira 0 delphi string unicode utf-16 delphi-2007

我使用此函数将文件读取到字符串

function LoadFile(const FileName: TFileName): string;
begin
  with TFileStream.Create(FileName,
      fmOpenRead or fmShareDenyWrite) do begin
    try
      SetLength(Result, Size);
      Read(Pointer(Result)^, Size);
    except
      Result := '';  
      Free;
      raise;
    end;
    Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这是文件的文字:

version  
Run Code Online (Sandbox Code Playgroud)

这是LoadFile的返回值:

'ÿþv'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0
Run Code Online (Sandbox Code Playgroud)

我想创建一个包含"verabc"的新文件.问题是我仍然有问题用"abc"替换"sion".我正在使用D2007.如果我删除所有#0,那么结果将成为中文字符.

Rob*_*edy 8

你认为文件的文本实际上不是文件的文本.您在字符串变量中读到的内容是准确的.您有一个Unicode文本文件编码为little-endian UTF-16.前两个字节表示字节顺序标记,之后的每对字节是字符串的另一个字符.

如果您正在读取Unicode文件,则应使用Unicode数据类型,例如WideString.在设置字符串的长度时,您需要将文件大小除以2,并且您将要丢弃前两个字节.

如果你不知道你正在读什么类型的文件,那么你需要先读取前两个或三个字节.如果前两个字节是$ ff $ fe,如上所述,那么你可能有一个小端UTF-16文件; 读取文件的其余部分WideString,或者UnicodeString如果您有该类型.如果它们是$ fe $ ff,那么它可能是大端的; 将文件的其余部分读入a WideString然后交换每对字节的顺序.如果前两个字节是$ ef $ bb,则检查第三个字节.如果它是$ bf,那么它们可能是UTF-8字节顺序标记.丢弃所有三个并将文件的其余部分读入一个AnsiString或一个字节数组,然后使用类似的函数UTF8Decode将其转换为WideString.

一旦将数据放入a中WideString,调试器就会显示它包含的数据version,并且使用启用Unicode的版本进行StringReplace替换时应该没有问题.