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,请检查内容。
我正在尝试将 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,请检查内容。