TStringList.LoadFromFile 统一码

TStringList.LoadFromFile Unicode

我正在尝试将 txt 文件打开到 StringList,但如果我打开 UTF-8 格式,它无法加载,这令人困惑,因为我有 Unicode XE2,我在这里错过了什么愚蠢的东西吗?

简单示例

Sl := tStringList.Create;

SL.LoadFromFile(sFilePath);

For i =0 to SL.Count -1 do
  foo

但是当 txt 文件是 UTF-8 时字符串不会加载,但当它是 ANSI 格式时可以正常工作。

TStringList.LoadFromFile 将尝试从文件的字节顺序标记 (BOM) 推断编码。如果不存在 BOM,则假定使用 ANSI 编码。

在您的情况下,显然没有 BOM,因此您必须告诉 LoadFromFile 使用哪种编码。通过将编码指定为传递给 LoadFromFile:

的第二个参数来做到这一点
SL.LoadFromFile(sFilePath, TEncoding.UTF8);

如果您的 UTF-8 文件 有 BOM,那么加载包含无效 UTF-8 字节序列的 UTF-8 文件将产生空结果,没有异常或失败的迹象。这是 'feature' 的 Delphi 文件处理。因此,如果您看到此结果并且您的文件具有有效的 BOM,请检查内容。