2015-08-28 67 views
4

當我將對象從TStringList類文件內容保存到文件時,默認情況下,該文件是使用UTF-8正確保存的,但帶有BOM的UTF-8保存。如何從TStringList類保存一個對象到UTF8沒有BOM的文件(Delphi XE 2)?

我的代碼是:

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

在示例中,文件 「MYFILE.DAT」 顯示爲 「UTF-8 BOM」 編碼。

如何保存沒有BOM的文件?

回答

9

您只需TStrings.WriteBOM屬性設置爲false

的文件告訴我們這一點:

會引起SaveToStream或的SaveToFile寫一個BOM。

設置WriteBOM造成SaveToStream寫一個BOM(字節順序標記)的流,並引起的SaveToFile寫了BOM的文件。

+0

謝謝@ sir-rufo這真的是一個很好的出口。但是對於新文件來說是真實的。在保存之前讀取文件時(LoadFromFile ...),不成立。也許與德爾福XE2的問題。我會嘗試更新Delphi版本。這太奇怪了。 –

+1

我沒有明白這一點,因爲我沒有看到任何代碼行(XE8),其中屬性'WriteBOM'被設置爲除了'構造函數'和'AssignTo',如預期的那樣。默認值爲「true」,除非您這樣做,否則不會更改。 –

+0

僅供參考,在Delphi XE中增加了'TStrings.WriteBOM',但'TStrings'在D2009中首次獲得了'TEncoding'支持。但SirRufo是正確的,即使在加載之後,'WriteBOM'將始終爲True,除非您明確將其設置爲False。 'TStrings.LoadFrom ...()'方法不會改變'WriteBOM'的值,但是它們會改變'TStrings.Encoding'屬性的值。 –

10

您可以通過創建自己的編碼類從TUTF8Encoding下降並重寫GetPreamble方法實現這一目標: -

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

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

+0

Andy_D在我的測試中,使用了您修改過的類,最終的文件保存爲ANSI編碼。 –

+0

@FabianoSilva你確定嗎?你是如何檢查輸出編碼的? – GabrielF

+0

是@GabrielF,在Notepad ++中,輸出編碼是ANSI。 –

相關問題