如何防止 TStrings.SaveToStream 写入 BOM?

ala*_*ncc 2 delphi tstringlist delphi-xe3

我正在使用 Delphi XE3。

在我的代码中,我需要创建一个文件流,然后将一些我自己的数据,以及几个TStringList的内容写入其中。该文件采用 UTF-16LE 格式。

因此,我的代码:

FileStream := TFileStream.Create('D:\MyFile.dat', fmCreate or fmOpenWrite or fmShareExclusive);

try
  // Write some data to FileStream

  // Write contents of StringList1 into FileStream
  StringList1.SaveToStream(FileStream, TEncoding.Unicode);

  // Write some more data to FileStream

  // Write contents of StringList2 into FileSteram
  StringList2.SaveToStream(FileStream, TEncoding.Unicode);
finally
  FileStream.Free;
end;
Run Code Online (Sandbox Code Playgroud)

执行完代码,发现一个问题,每次调用StringList1.SaveToStream(FileStream, TEncoding.Unicode); 它将写入 BOM (0xFFFE),然后是字符串列表中的实际字符串。

因此,我得到一个这样的 Unicode 文件:

0xFFFE(第一个是我自己写的)

(一些数据)

0xFFFE(StringList1 内容)

(一些数据)

0xFFFE(StringList2 内容)

但这不是我所期望的,因为文件开头应该只有一个 0xFFFE。因此,我只是想知道如何在写入实际字符串列表之前防止 StringList1.SaveToStream 写入 0xFFFE BOM?

ala*_*ncc 6

我为我的问题找到了另一个解决方案。

TStrings 有一个 WriteBOM 属性,它会控制在使用 SaveToStream 或 SaveToFile 时是否写出 BOM。

因此,使用以下代码将禁用 BOM:

  StringList1.WriteBOM := False;
  StringList1.SaveToStream(FileStream, TEncoding.Unicode);
Run Code Online (Sandbox Code Playgroud)