gpt4 book ai didi

Delphi:TStringList不理解BOM?

转载 作者:行者123 更新时间:2023-12-02 22:28:20 25 4
gpt4 key购买 nike

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=''。没有BOM一切都可以。
正常吗?

最佳答案

如果您使用的是 2009 年之前的 Delphi 版本,它不支持 Unicode,并且 BOM 对 TStringList 没有意义。

如果您使用的是 D2009 或更高版本(支持 Unicode),如果您提前知道编码是什么,则可以使用重载的 TStringList.LoadFromStream(Stream: TStream; Encoding: TEncoding)是;如果不这样做,RTL 将尝试使用 TEncoding.GetBufferEncoding 来解决这个问题。您可以查看主题为here的Delphi XE文档。

如果你事先不知道,并且RTL无法从内容中弄清楚,你可以随时从流中自己读取BOM,然后设置Stream.Position 紧接在 BOM 之后,并使用您根据该 BOM 自行确定的解码从该位置加载 TStringList

此外,简单地创建一个 TFileStream 然后加载到 TStringList 是一种浪费; TStringList.LoadFromFile 将处理文件本身,如果这就是您要对 TStream 执行的全部操作,则代码要少得多。

编辑:在您发表评论后,我想我应该包含我熟悉的 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 类型的问题,这些差异极其重要。)

关于Delphi:TStringList不理解BOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com