【问题标题】:How can I save a object from TStringList class to file (Delphi XE 2) with UTF8 without BOM?如何使用没有 BOM 的 UTF8 将 TStringList 类中的对象保存到文件(Delphi XE 2)?
【发布时间】:2015-08-28 15:33:22
【问题描述】:

当我将对象从 TStringList 类文件内容保存到文件时,文件以 UTF-8 正确保存,但默认情况下以 UTF-8 和 BOM 保存。

我的代码是:

myFile := TStringList.Create;
try
  myFile.Text := myData;
  myFile.saveToFile('myfile.dat', TEncoding.UTF8)
finally
  FreeAndNil(myFile);
end;

在示例中,文件“myfile.dat”显示为“UTF-8 BOM”编码。

如何在没有 BOM 的情况下保存文件?

【问题讨论】:

    标签: delphi utf-8 tstringlist


    【解决方案1】:

    您只需将属性TStrings.WriteBOM 设置为false

    文档告诉我们这一点:

    将导致 SaveToStream 或 SaveToFile 写入 BOM。

    WriteBOM 设置为 True 以使 SaveToStream 将 BOM(字节顺序标记)写入流,并使 SaveToFile 将 BOM 写入文件。

    【讨论】:

    • 感谢@sir-rufo,这真的是一个很好的退出。但是对于新文件来说是正确的。在保存之前读取文件时不正确(LoadFromFile ...)。 Delphi XE2可能有问题。我将尝试更新 Delphi 版本。这太奇怪了。
    • 我没有明白这一点,因为我没有看到任何代码行 (XE8),其中设置了属性 WriteBOM,但在 constructorAssignTo 中,这是符合预期的。默认值为true,除非您这样做,否则不会更改。
    • 仅供参考,TStrings.WriteBOM 是在 Delphi XE 中添加的,但 TStrings 在 D2009 中首先获得了 TEncoding 支持。但 SirRufo 是正确的,WriteBOM 将始终为 True,即使在加载后也是如此,除非您明确将其设置为 False。 TStrings.LoadFrom...() 方法不会更改 WriteBOM 的值,但它们更改 TStrings.Encoding 属性的值。
    【解决方案2】:

    您可以通过创建您自己的源自TUTF8Encoding 的编码类并覆盖GetPreamble 方法来实现这一点:-

    type
      TUTF8EncodingNoBOM = class(TUTF8Encoding)
      public
        function GetPreamble: TBytes; override;
      end;
    
    

    function TUTF8EncodingNoBOM.GetPreamble: TBytes; begin SetLength(Result, 0); end;

    【讨论】:

    • Andy_D 在我的测试中,使用你修改的类,最终文件保存为ANSI编码。
    • @FabianoSilva 你确定吗?你是如何检查输出编码的?
    • 是的@GabrielF,在 Notepad++ 中,输出编码是 ANSI。
    • @FabianoSilva IIRC,默认情况下,如果文件不包含非 ANSI 字符,notepad++ 会将其识别为 ANSI(在这种情况下,UTF8 和 ANSI 是一回事)。尝试在保存或更改 Notepad++ 配置之前添加一些特殊字符,以将其识别为 UTF8 w/o BOM(我不记得你在哪里更改)。
    • @FabianoSilva 我认为它在Setttings -> Preferences -> New document 之下。如果选择EncodingUTF8 w/o BOM 并勾选Apply to opened ANSI files,Notepad++ 将识别为UTF8 纯ASCII 文件。
    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 2011-06-23
    • 2015-12-12
    • 1970-01-01
    • 2020-09-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多