delphi - 如何防止 TStrings.SaveToStream 写入 BOM?
问题描述
我正在使用德尔福 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;
执行完代码后发现一个问题,每次调用 StringList1.SaveToStream(FileStream, TEncoding.Unicode); 它将写入 BOM (0xFFFE),然后是字符串列表中的实际字符串。
因此,我得到一个这样的 Unicode 文件:
0xFFFE(第一个是我自己写的)
(一些数据)
0xFFFE(StringList1 内容)
(一些数据)
0xFFFE(StringList2 内容)
但这不是我所期望的,因为文件开头应该只有一个 0xFFFE。因此,我只是想知道如何防止 StringList1.SaveToStream 在写入实际字符串列表之前写入 0xFFFE BOM?
解决方案
我为我的问题找到了另一种解决方案。
TStrings 有一个 WriteBOM 属性,它将控制在使用 SaveToStream 或 SaveToFile 时是否写出 BOM。
因此,使用以下代码将禁用 BOM:
StringList1.WriteBOM := False;
StringList1.SaveToStream(FileStream, TEncoding.Unicode);
推荐阅读
- javascript - 来自不同项目/域的 webpack 和 vue 异步组件
- java - Java bufferstrategy,图形错误::尚未创建缓冲区
- jboss - Standalone.xml 中的 Jboss 7.1 日志过滤器
- python - 在 int python 中转换 SQLITE 'NoneType
- java - SiddhiQL 中的语法错误,输入时没有可行的替代方案
- ios - Codenameone - IOS 调试构建失败
- r - 如何使用 pool 包逃脱 Athena database.table?
- r - 如何在 sqldf 查询中包含用户定义的变量?
- google-chrome - 从命令行启用 Chrome 标志
- tensorflow - 使用 tensorflow 对象检测减少误报的方法有哪些?