我在项目中与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编码。
答案 0 :(得分:6)
当前对象的默认编码。
在对LoadFromStream
或SaveToStream
的调用中指定了nil编码时,会使用DefaultEncoding 。
默认情况下, DefaultEncoding 设置为
Default
。如果LoadFromStream
或SaveToStream
需要其他默认编码,则用户可以更改 DefaultEncoding 。
但请注意TStrings.Encoding
属性:
从流或文件中读取时确定的字符编码。
Encoding
是一个只读属性,包含调用LoadFromStream
或LoadFromFile
方法时检测到的字符编码的值。 如果文件或流不包含BOM(无法检测到编码值),则Encoding
将设置为DefaultEncoding
属性中指定的值。
Encoding
用于SaveToStream
和SaveToFile
方法。
如果未给出
Encoding
参数[{1}}],则使用适当的编码加载字符串。通过调用LoadFromStream
类的GetBufferEncoding
例程来获取编码的值。TEncoding
然后将编码值保存在LoadFromStream
属性中,以便在保存流时使用。
因此,只要您不致电Encoding
,就可以将LoadFrom...()
设置为DefaultEncoding
然后调用TEncoding.Unicode
而不指定SaveTo...()
的值参数。
但是,一旦您调用Encoding
,LoadFrom...()
属性优先于Encoding
属性,以便后续调用DefaultEncoding
。只要文件不是BOM,SaveTo...()
属性就会匹配Encoding
属性。但如果遇到非UTF16LE BOM,则所有投注均已关闭。
为确保始终使用DefaultEncoding
,您应继续使用TEncoding.Unicode
和Encoding
的{{1}}参数,这就是它们存在的原因。它们优先考虑,LoadFrom...()
属性是在未明确说明输入/输出编码时的后备。