【问题标题】:Delphi - TStringList Save/Load to stream encodingDelphi - TStringList 保存/加载到流编码
【发布时间】:2016-06-22 02:08:59
【问题描述】:

我在我的项目中经常使用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 编码加载。

【问题讨论】:

    标签: delphi delphi-10-seattle


    【解决方案1】:

    查看TStrings.DefaultEncoding 属性。

    当前对象的默认编码。

    DefaultEncoding 在对LoadFromStreamSaveToStream 的调用中指定零编码时使用。

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

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

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

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

    Encoding 用于SaveToStreamSaveToFile 方法。

    如果没有给出Encoding 参数[LoadFromStream],则使用适当的编码加载字符串。编码的值是通过调用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 属性是未明确说明输入/输出编码时的后备。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 2012-12-05
      • 2011-08-04
      • 2018-04-04
      • 1970-01-01
      相关资源
      最近更新 更多