繁体   English   中英

Delphi:TStringList不了解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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM