[英]How can I save a object from TStringList class to file (Delphi XE 2) with UTF8 without BOM?
[英]Delphi: TStringList does not understand BOM?
TStringList不了解BOM吗?
Tf1 := TFileStream.Create(LIGALOG+'liga.log',fmOpenRead or fmShareDenyNone);
str:=tstringlist.Create;
str.LoadFromStream(tf1);
String1:='FStream '+inttostr(tf1.Size)+'/ String: '+(str.Text);
如果文本文件保存在UTF-8 + BOM中,则Str.Count=0; Str.Text=''
Str.Count=0; Str.Text=''
。 没有BOM,一切正常。
正常吗
如果您使用的是2009年之前的Delphi版本,则该版本不支持Unicode,并且BOM对TStringList毫无意义。
如果您使用的是D2009或更高版本(支持Unicode),则可以提前使用重载的TStringList.LoadFromStream(Stream: TStream; Encoding: TEncoding)
,前提是您知道什么是编码。 如果您不这样做,那么RTL会尝试使用TEncoding.GetBufferEncoding
找出它。 您可以在此处查看有关该主题的Delphi XE文档
如果您不提前知道,而RTL无法从内容中找出它,则始终可以自己从流中读取BOM,然后将Stream.Position
设置为BOM之后并加载从该位置开始的TStringList
,以及根据该BOM确定自己的解码。
同样,创建一个TFileStream
只是简单地然后加载到TStringList
也是一种浪费; TStringList.LoadFromFile
将处理文件本身,并且如果这就是您要使用TStream
的所有操作,则代码要少TStream
。
编辑:在您发表评论后,我想我会列出一个我熟悉的BOM表-可能还有更多我不知道的BOM表:
$00 $00 $FE $FF UTF-32, big-endian (bytes must be swapped for Windows)
$FE $FF $00 $00 UTF-32, little-endian
$FF $FE UTF-16 2 byte chars little-endian
$FE $FF UTF-16 2 byte big-endian
$EF $BB $BF Unicode UTF-8 (must be decoded before using Unicode data)
(供以后参考:您应该在标签或问题文本中指出您使用的是哪个版本的Delphi,因为它们之间的VCL和RTL存在差异。涉及Unicode / BOM类型问题,这些差异非常重要。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.