繁体   English   中英

Delphi - TStringList保存/加载流编码

[英]Delphi - TStringList Save/Load to stream encoding

我正在我的项目中使用TStringListTMemeorySteam

  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编码。

看看TStrings.DefaultEncoding属性。

当前对象的默认编码。

在对LoadFromStreamSaveToStream的调用中指定nil编码时,将使用DefaultEncoding

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

但是,请注意TStrings.Encoding属性:

在从流或文件读取期间确定的字符编码。

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

Encoding用于SaveToStreamSaveToFile方法。

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

因此,只要不调用LoadFrom...() ,就可以将DefaultEncoding设置为TEncoding.Unicode ,然后调用SaveTo...()而不指定Encoding参数的值。

但是,一旦调用LoadFrom...()Encoding属性优先于DefaultEncoding属性,以便后续调用SaveTo...() 只要文件没有BOM, Encoding属性就会匹配DefaultEncoding属性。 但如果遇到非UTF16LE BOM,则所有投注均已关闭。

为了确保始终使用TEncoding.Unicode ,您应该继续使用LoadFrom...()SaveTo...()Encoding参数,这就是它们存在的原因。 它们具有第一优先级,当未明确声明输入/输出编码时, (Default)Encoding属性是回退。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM