Delphi - TStringList 保存/加载到流编码

5

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

1个回答

7
请查看TStrings.DefaultEncoding属性。

当前对象的默认编码。

DefaultEncoding在调用LoadFromStreamSaveToStream时指定了空编码时使用。

默认情况下,DefaultEncoding设置为Default。用户可以更改DefaultEncoding,以便为LoadFromStreamSaveToStream选择另一个默认编码。

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

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

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

EncodingSaveToStreamSaveToFile方法中使用。

如果未提供Encoding参数,则使用适当的编码加载字符串。通过调用TEncoding类的GetBufferEncoding例程来获取编码的值。LoadFromStream然后将编码的值保存在Encoding属性中,以便在保存流时使用。 因此,只要不调用LoadFrom...(),就可以将DefaultEncoding设置为TEncoding.Unicode,然后调用SaveTo...()而不指定Encoding参数的值。
但是,一旦调用了LoadFrom...(),对于后续调用SaveTo...()Encoding属性优先于DefaultEncoding属性。只要文件没有BOM,Encoding属性将与DefaultEncoding属性匹配。但是,如果遇到非UTF16LE BOM,则所有赌注都会消失。
为确保始终使用 TEncoding.Unicode,您应继续使用 LoadFrom...()SaveTo...()Encoding 参数,这就是它们存在的原因。它们具有第一优先级,(Default)Encoding 属性是在未明确指定输入/输出编码时的备选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接