【发布时间】:2016-04-06 05:15:30
【问题描述】:
我有一个 .URL 文件,其中包含以下包含德语变音符号的文本:
[互联网快捷方式]
网址=http://edn.embarcadero.com/article/44358
[我的应用]
注释=特殊测试 geändert
图标=默认
Title=RAD Studio XE8 的错误修复列表
我尝试使用TMemIniFile 加载文本:
uses System.IniFiles;
//
procedure TForm1.Button1Click(Sender: TObject);
var
BookmarkIni: TMemIniFile;
begin
// The error occurs here:
BookmarkIni := TMemIniFile.Create('F:\Bug fix list for RAD Studio XE8.url',
TEncoding.UTF8);
try
// Some code here
finally
BookmarkIni.Free;
end;
end;
这是来自调试器的错误消息文本:
Project MyApp.exe 引发异常类 EEncodingError 并带有消息 '目标多字节中不存在 Unicode 字符的映射 代码页”。
当我从 .URL 文件中删除带有德语变音符号“geändert”的单词时,没有错误。
但这就是我使用TMemIniFile 的原因,因为当.URL 文件中的文本包含Unicode 字符时,TIniFile 在这里不起作用。 (.URL 文件中还可能有其他 Unicode 字符)。
那么为什么我在TMemIniFile.Create 中遇到异常?
编辑:找到罪魁祸首:.URL 文件是ANSI 格式。当 .URL 文件为 UTF-8 格式时,不会发生该错误。但是当文件是ANSI 格式时,我该怎么办?
EDIT2:我创建了一个解决方法,它对ANSI 和UTF-8 文件都有效:
procedure TForm1.Button1Click(Sender: TObject);
var
BookmarkIni: TMemIniFile;
BookmarkIni_: TIniFile;
ThisFileIsAnsi: Boolean;
begin
try
ThisFileIsAnsi := False;
BookmarkIni := TMemIniFile.Create('F:\Bug fix list for RAD Studio XE8.url',
TEncoding.UTF8);
except
BookmarkIni_ := TIniFile.Create('F:\Bug fix list for RAD Studio XE8.url');
ThisFileIsAnsi := True;
end;
try
// Some code here
finally
if ThisFileIsAnsi then
BookmarkIni_.Free
else
BookmarkIni.Free;
end;
end;
你怎么看?
【问题讨论】:
-
你的解决方案很糟糕。选择一种编码。
-
@DavidHeffernan 请看我下面的评论,证明我的解决方法在所有 3 种情况下都返回了正确的结果,在没有 BOM 的情况下,没有任何其他方法可以为 UTF-8 文件获得正确的结果!跨度>
-
看看我对你下面评论的评论...:-) 如果没有 BOM,就没有万无一失的方法。
-
您无法仅从文件内容中可靠地恢复编码。这是众所周知的。
标签: delphi unicode utf-8 ini delphi-10-seattle