Delphi搜索和替换代码不起作用

时间:2013-04-21 19:38:24

标签: delphi

我想让这段代码正常运行。它是标准的搜索和替换功能。

我没有任何错误,但由于某种原因,文本文件中没有任何变化。

以下是完整代码:

procedure FileReplaceString(const FileName, searchstring, replacestring: string);
var
  fs: TFileStream;
  S: string;
begin
  fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
  try
    SetLength(S, fs.Size);
    fs.ReadBuffer(S[1], fs.Size);
  finally
    fs.Free;
  end;
  S  := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]);
  fs := TFileStream.Create(FileName, fmCreate);
  try
    fs.WriteBuffer(S[1], Length(S));
  finally
    fs.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
  var Path, FullPath:string;
begin
  Path:= ExtractFilePath(Application.ExeName);
  FullPath:= Path + 'test.txt';
  FileReplaceString(FullPath,'changethis','withthis');

end;

1 个答案:

答案 0 :(得分:7)

原因是Ssearchstringreplacestring是Unicode字符串(例如,“Test”是54 00 65 00 73 00 74 00),而文本文件可能是UTF-8或ANSI文件(例如,“Test”为54 65 73 74)。

这意味着S中存储的值将严重损坏(您获取UTF-8文本的字节并将其解释为Unicode文本的字节)!在Test示例中,您将获得敔瑳??,其中最后两个字符是随机的(为什么?)。

要测试这个假设,只需将S声明为AnsiString,然后就可以了。

当然,如果您需要Unicode支持,则需要进行一些UTF-8编码/解码。解决问题的最简单方法是使用TStringList;那么你就可以免费获得所需的一切。