2016-06-22 17 views
4

我正在与TStringListTMemeorySteam很多在我的项目。德尔福-TStringList保存/加载流编码

msTmp := TMemoryStream.Create; 
    try 
    lTemp.SaveToStream(msTmp, TEncoding.Unicode); 
    finally 
    msTmp.Free; 
    end; 
    ..... 
    lTemp := TStringList.Create; 
    try 
    lTemp.LoadFromFile(msTmp, TEncoding.Unicode); 
    finally 
    lTemp.Free; 
    end; 

我怎么能告诉LoadFromStream()SaveToStream()流是UTF-16默认情况下,在我的项目编码,而不包括在每个呼叫的编码类型。 所以我只能拨打LoadFromStream(msTmp),它将以UTF-16编码加载。

回答

6

看看TStrings.DefaultEncoding属性。

当前对象的默认编码。

DefaultEncoding当在呼叫被指定为LoadFromStreamSaveToStream的零编码被使用。

默认情况下,DefaultEncoding设置为Default。如果LoadFromStreamSaveToStream需要另一个默认编码,则用户可以更改DefaultEncoding

然而,注意的TStrings.Encoding属性:从流或文件中读取期间确定

字符编码。

Encoding是一个只读属性,它包含调用LoadFromStreamLoadFromFile方法时检测到的字符编码的值。 如果文件或流不包含BOM(无法检测到编码值),则Encoding将设置为DefaultEncoding属性中指定的值。

Encoding用于SaveToStreamSaveToFile方法。

如果[的LoadFromStream]的Encoding参数没有给出,则字符串所使用的适当的编码加载。编码的值是通过调用TEncoding类的GetBufferEncoding例程获得的。 LoadFromStream然后将编码的值保存在Encoding属性中,以便在保存流时使用。

所以,只要你不叫LoadFrom...(),您可以设置DefaultEncodingTEncoding.Unicode,然后调用SaveTo...()没有指定为Encoding参数的值。

但是,一旦您致电LoadFrom...()Encoding属性将优先于DefaultEncoding属性,以便后续调用至SaveTo...()。只要文件不是BOM'ed,Encoding属性将匹配DefaultEncoding属性。但如果遇到非UTF16LE BOM,则所有投注均关闭。

为确保始终使用TEncoding.Unicode,应继续使用LoadFrom...()和的参数Encoding,这就是它们存在的原因。它们优先考虑,当输入/输出编码没有明确说明时,(Default)Encoding属性是回退。