Delphi - TStringList保存/加载流编码

时间:2016-06-22 02:09:00

标签: delphi delphi-10-seattle

我在项目中与TStringList TMemeorySteam合作很多。

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

1 个答案:

答案 0 :(得分:6)

查看TStrings.DefaultEncoding属性。

  

当前对象的默认编码。

     在对LoadFromStreamSaveToStream的调用中指定了nil编码时,会使用

DefaultEncoding

     

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

但请注意TStrings.Encoding属性:

  

从流或文件中读取时确定的字符编码。

     

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

     

Encoding用于SaveToStreamSaveToFile方法。

  

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

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

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

为确保始终使用DefaultEncoding,您应继续使用TEncoding.UnicodeEncoding的{​​{1}}参数,这就是它们存在的原因。它们优先考虑,LoadFrom...()属性是在未明确说明输入/输出编码时的后备。