Delphi - TStringList保存/加载流编码

Rep*_*til 5 delphi delphi-10-seattle

我工作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;
Run Code Online (Sandbox Code Playgroud)

我如何能够 在我的项目中告知LoadFromStream()并且SaveToStream()默认情况下流是UTF-16编码的,而不包括每次调用中的编码类型.所以我只能打电话LoadFromStream(msTmp),它将加载UTF-16编码.

Rem*_*eau 7

看看TStrings.DefaultEncoding酒店.

当前对象的默认编码.

在调用LoadFromStream或指定nil编码时使用DefaultEncodingSaveToStream.

默认情况下,DefaultEncoding设置为Default.用户可以改变DefaultEncoding如果另一个缺省编码期望LoadFromStreamSaveToStream.

但请注意TStrings.Encoding酒店:

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

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

Encoding用于SaveToStreamSaveToFile方法.

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

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

但是,一旦你打电话LoadFrom...(),该Encoding属性优先于该DefaultEncoding属性进行后续调用SaveTo...().只要文件没有BOM,该Encoding属性将匹配该DefaultEncoding属性.但如果遇到非UTF16LE BOM,则所有投注均已关闭.

为了确保TEncoding.Unicode始终使用,你应该继续使用Encoding的参数LoadFrom...()SaveTo...(),这就是为什么它们的存在.它们优先考虑,(Default)Encoding当没有明确说明输入/输出编码时,属性是后备.